(node中)module.exports 和exports的区别

news2025/6/30 9:56:20

(node中使用)module.exports 和exports的区别是什么?

用一句话来说明就是,require只会去引用module.exports这个对象的导出,不会引用exports对象的,而我们在编写模块时(初始化)用到的exports对象实际上只是对module.exports的引用。

来新建一个 module.js 文件:

console.log(exports === module.exports);

console.log(exports);

然后在命令行下运行 node module.js:

$ node module.js
true
{}

=== 判断结果为 true。这说明二者是一样的,指向同一个空对象 {}。

exports.pi = 3.14;
// vs
module.exports.pi = 3.14;

但是从模块使用者角度说,则二者是有区别的。

不具名数据

假设我作为模块使用者,要在我的代码中导入一个函数:

const func = require('./module');

则编写者只能使用 module.exports 来定义:

module.exports = function () {}

如果编写者使用 exports 来定义:

exports.func = function () {}

则使用者必须知道该函数的名称才能使用:

const { func } = require('./module');

把函数换成变量、常量或其它,也是一样道理。

注意对象

前面说,module.exports 与 exports 指向同一个空对象 {} - 且叫它 M。也就是说,不管是 exports.pi = 3.14 还是 module.exports.pi = 3.14,都是在操作 M 对象 - 在 Node/JavaScript 下。

但是对象是可变的,可以任意修改。(如果二者不指向同一个对象了,那么exports的导出,require会引用不到)因此我们可以直接给 exports 赋值:

exports = 3.14;

但这时,exports 就失去存在意义了。因为赋值以后,它不再指向对象 M,也就无法操作 M 对象,也就无法控制模块要导出的数据。所以上述写法是错误的,应该避免。

那么,给 module.exports 赋值对象以外的值呢

module.exports = 3.14;

这是没问题的(因为reuqiure寻找的就是module.exports这个对象的指向,现在它指向了“3.14” 这个字符串,),这说明模块默认导出一个数值,而不是 M 对象。

在 Node.js 模块里,真正控制模块导出的是 module.exports,exports 只是 module.exports 决定导出一个对象时的一个快捷方式,假如 module.exports 导出其它类型的数据,比如字符串、数值、函数等等,则 exports 的存在没有意义。这是 Node.js 模块与 CommonJS 差异的一点,在 CommonJS 规范里,是只有 exports,没有 module.exports 的。

又例如:

//test.js
const object = { na: "name", age: 18 }
exports = object;
//main.js
const ex = require("./test")
console.log("ex", ex);

输出为一个空对象
在这里插入图片描述

重要结论:module.exports 和 exports 同指一个对象,但是最终暴露结果以 module.exports 的为准,上面的代码中,exports 改变了指向,而我们又没有为 module.exports 挂载任何的属性或方法,所以就拿到了空对象。
画图举例:

在这里插入图片描述

刚开始 module.exports 和 exports 指向同一个对象

== 我们向外暴露时,是以 module.exports 为标准的 ==

总结

  1. exports 对象是 module 对象的一个属性,在初始时 module.exports 和 exports 指向同一块内存区域
  2. 模块导出的是 module.exports , exports 只是对它的引用,在不改变exports 内存的情况下,修改exports 的值可以改变 module.exports 的值
  3. 导出时尽量使用 module.exports ,以免因为各种赋值导致的混乱

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

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

相关文章

微服务框架 SpringCloud微服务架构 分布式缓存 44 Redis 分片集群 44.4 故障转移

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 分布式缓存 文章目录微服务框架分布式缓存44 Redis 分片集群44.4 故障转移44.4.1 故障转移44.4.2 数据迁移44 Redis 分片集群 44.4 故障转移…

[附源码]Python计算机毕业设计高等数学在线学习平台Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

零基础怎么学Python?要学多久?

首发内容,希望从各个角度为大家解答Python的学习方向,能够帮助更多入门的同学们。 一、为什么学Python 是因为铺天盖地的广告还是要转行,有本职工作希望自动化办公还是爱好? (1)有本职工作觉得应该学Pyt…

你一定要了解的NAT工作原理

大家好,我是技福的小咖老师。 前两天给大家分享了NAT策略问题的23个问题,有朋友私信我,想再普及一下NAT基础知识。今天咱们就来复习下NAT的工作原理。 随着网络应用的增多,IPv4地址枯竭的问题越来越严重。尽管IPv6可以从根本上解…

mybatis06:Mybatis注解开发

目录 1 MyBatis的常用注解 1.1注解完成基本的crud 例题演示 1.2mybatis的注解复杂查询映射开发 例题演示 1 MyBatis的常用注解 这几年来注解开发越来越流行,Mybatist也可以使用注解开发方式,这样我们就可以减少编写Mapper映射文件了。我们先用绕一些基…

mongoDB使用总结

windows安装 zip压缩包方式安装 下载 注意:因为现在最新版的mongodb不兼容win7,对windows系统的最低要求是win10。所以win7系统要安装mongodb数据库必须考虑使用旧版安装。 Download MongoDB Community Server | MongoDB 解压 将压缩包解压放在指定位置&#x…

世界杯,来一起“唠嗑”呀!

自人类诞生起,娱乐与社交便是融入群体、参与群体行动的“必需品”。娱乐与社交的结合使得人们更加容易找寻同类、拉近同类关系,而四年一届的世界杯正是娱乐与社交的完美融合体。作为全球最富影响力的体育赛事之一,每一届世界杯都影响着全球几…

thinkphp中 Db::query()和Db::name()区别 $db->query($sql); ->相当于访问类里面的方法

Db::query()是原生sql查询。 例如 Db::query(“select * from cmf_user where id9”); Db::name()是thinkphp基于原生sql二次封装的sql查询。 例如Db::name(‘user’)->where(‘id’,9)->find(); db是一个实例化好的数据库类,query是这个类里面的一个方法&am…

PMP每日一练 | 考试不迷路-12.14(包含敏捷+多选)

被延期考试的宝子 一定要坚持刷题 每日5道PMP习题助大家上岸PMP! ​题目1-2: ​1.一位主要相关方要求将每日站立会议的持续时间人15分钟增加到1小时。Scrum主管应该做什么? ( ) A.接受建议并建议团队更改会议时间表 B.安排与产品负责人和团队…

内网穿透用什么软件好?本地设置内网端口映射到外网访问

我们经常听到有人说在用内网穿透工具,那么内网穿透工具有什么作用呢?内网穿透工具的作用是将本地内网服务器和应用提供到互联网上连接访问,可以解决在无公网IP条件下跨网互通互连问题。比如在家远程办公,访问公司内部办公OA服务器…

Socket.IO与Atmosphere比较

最近接到一个新需求,前后端保持状态连接,实现动态刷新的效果。那第一个想到的就是websocket,但是websocket我们知道有一个缺陷就是兼容性比较差(如下图红色表示不兼容的浏览器版本),受网络限制比较大。 我…

常考vue面试题(附答案)

Vue生命周期钩子是如何实现的 vue的生命周期钩子就是回调函数而已,当创建组件实例的过程中会调用对应的钩子方法内部会对钩子函数进行处理,将钩子函数维护成数组的形式 Vue 的生命周期钩子核心实现是利用发布订阅模式先把用户传入的的生命周期钩子订阅好…

2022年山东建筑安全员考试真题题库及答案

百分百题库提供建筑安全员考试试题、安全员证考试真题、安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 142.施工现场内的()等机械设备,以及钢脚手架和正在施工的在建工程等的金属结构,当在相邻建筑物、构筑物等设施防雷装置接闪…

C++ Reference: Standard C++ Library reference: Containers: map: map: clear

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/clear/ 公有成员函数 <map> std::map::clear C98 void clear(); C11 void clear() noexcept;清除内容 从map容器中删除所有元素&#xff08;已销毁&#xff09;&#xff0c;使容器的size为0。 形参 …

【Kafka】Mac下安装与使用,SpringBoot整合案例

【Kafka】Mac下安装与使用&#xff0c;SpringBoot整合案例&#xff08;一&#xff09;下载安装&#xff08;二&#xff09;测试用例【1】启动zookeeper【2】启动kafka【3】创建Topic【4】查看Topic【5】删除Topic【6】生产/消费数据【7】查看消费组【8】查看消费组详情&#xf…

太卷了,这份Java架构师晋升指南首次公开,GitHub下载量已破百万

最近和各位小伙伴儿私下聊的比较多&#xff0c;各个阶段的朋友都有&#xff1b;因为大环境的内卷&#xff0c;导致大家在求学、求职、提升自己的各个方面都多多少少有些迷茫焦虑&#xff1b; 这些其实是一个非常普遍且正常的现象&#xff0c;会焦虑的人&#xff0c;往往都是对…

智云通CRM:那些令你无法控制的销售局面(二)

1、向并不合适的潜在客户进行销售 选对战场是分配资源的关键。对于那些销售工作很复杂的业务员来说&#xff0c;他们当中的大多数一年最多会有10-20次的机会&#xff0c;可是有些时候&#xff0c;最后他们手里的机会也就剩下一个了。挑选不合适的潜在客户会消耗许多资源。 2、…

家电供应链再遭新风险,SCM供应链管理系统加快业务流转提升企业内控水平

在疫情不断反复的影响下&#xff0c;刚刚进入复苏阶段的家电企业再次面临新一轮危机。2022年一季度&#xff0c;中国家电实现零售额1430亿元&#xff0c;同比下降11.1%&#xff1b;线上家电零售市场下降7.5%。海关数据显示&#xff0c;前两个月&#xff0c;家电产品海外出口规模…

[附源码]计算机毕业设计的校园报修平台Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

基于Java实现(Web)考勤管理系统【100010040】

考勤系统设计文档 一、用户需求 1.1 目标 规范员工的上下班、请假、外出工作等行为方便计算员工的薪金方便管理各种带薪假期共享员工的请假及外出工作的信息 1.2 涉众 序号涉众待解决的问题1普通员工方便的查看自己的请假及外出记录2行政部员工与财务部的“接口”尽量简单…