广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >详解nodejs中exports和module.exports的区别
  • 531
分享到

详解nodejs中exports和module.exports的区别

详解区别exports 2022-06-04 17:06:56 531人浏览 薄情痞子
摘要

require 用来加载代码,而 exports 和 module.exports 则用来导出代码。但很多新手可能会迷惑于 exports 和 module.exports 的区别,为了更好的理解 expo

require 用来加载代码,而 exports 和 module.exports 则用来导出代码。但很多新手可能会迷惑于 exports 和 module.exports 的区别,为了更好的理解 exports 和 module.exports 的关系,我们先来巩固下 js 的基础。示例:

app.js


var a = {name: 'nswbmw 1'};
var b = a;
console.log(a);
console.log(b);
b.name = 'nswbmw 2';
console.log(a);
console.log(b);
var b = {name: 'nswbmw 3'};
console.log(a);
console.log(b);

运行 app.js 结果为:


{ name: 'nswbmw 1' }
{ name: 'nswbmw 1' }
{ name: 'nswbmw 2' }
{ name: 'nswbmw 2' }
{ name: 'nswbmw 2' }
{ name: 'nswbmw 3' }

解释一下:a 是一个对象,b 是对 a 的引用,即 a 和 b 指向同一个对象,即 a 和 b 指向同一块内存地址,所以前两个输出一样。当对 b 作修改时,即 a 和 b 指向同一块内存地址的内容发生了改变,所以 a 也会体现出来,所以第三、四个输出一样。当对 b 完全覆盖时,b 就指向了一块新的内存地址(并没有对原先的内存块作修改),a 还是指向原来的内存块,即 a 和 b 不再指向同一块内存,也就是说此时 a 和 b 已毫无关系,所以最后两个输出不一样。

明白了上述例子后,我们进入正题。

我们只需知道三点即可知道 exports 和 module.exports 的区别了:

exports 是指向的 module.exports 的引用 module.exports 初始值为一个空对象 {},所以 exports 初始值也是 {} require() 返回的是 module.exports 而不是 exports

所以:我们通过


var name = 'nswbmw';
exports.name = name;
exports.sayName = function() {
 console.log(name);
}

给 exports 赋值其实是给 module.exports 这个空对象添加了两个属性而已,上面的代码相当于:


var name = 'nswbmw';
module.exports.name = name;
module.exports.sayName = function() {
 console.log(name);
}

我们通常这样使用 exports 和 module.exports

一个简单的例子,计算圆的面积:

使用 exports

app.js


var circle = require('./circle');
console.log(circle.area(4));

circle.js


exports.area = function(r) {
 return r * r * Math.PI;
}

使用 module.exports

app.js


var area = require('./area');
console.log(area(4));

area.js


module.exports = function(r) {
 return r * r * Math.PI;
}

上面两个例子输出是一样的。你也许会问,为什么不这样写呢?

app.js


var area = require('./area');
console.log(area(4));

area.js


exports = function(r) {
 return r * r * Math.PI;
}

运行上面的例子会报错。这是因为,前面的例子中通过给 exports 添加属性,只是对 exports 指向的内存做了修改,而


exports = function(r) {
 return r * r * Math.PI;
}

其实是对 exports 进行了覆盖,也就是说 exports 指向了一块新的内存(内容为一个计算圆面积的函数),也就是说 exports 和 module.exports 不再指向同一块内存,也就是说此时 exports 和 module.exports 毫无联系,也就是说 module.exports 指向的那块内存并没有做任何改变,仍然为一个空对象 {} ,也就是说 area.js 导出了一个空对象,所以我们在 app.js 中调用 area(4) 会报 TypeError: object is not a function 的错误。

所以,一句话做个总结:当我们想让模块导出的是一个对象时,exports 和 module.exports 均可使用(但 exports也不能重新覆盖为一个新的对象),而当我们想导出非对象接口时,就必须也只能覆盖 module.exports。

我们经常看到这样的用写法:

exports = module.exports = somethings;

上面的代码等价于


module.exports = somethings;
exports = module.exports;

原因也很简单,module.exports = somethings 是对 module.exports 进行了覆盖,此时 module.exports 和 exports 的关系断裂,module.exports 指向了新的内存块,而 exports 还是指向原来的内存块,为了让 module.exports 和 exports 还是指向同一块内存或者说指向同一个 “对象”,所以我们就 exports = module.exports。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持编程网!

--结束END--

本文标题: 详解nodejs中exports和module.exports的区别

本文链接: https://www.lsjlt.com/news/12803.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解nodejs中exports和module.exports的区别
    require 用来加载代码,而 exports 和 module.exports 则用来导出代码。但很多新手可能会迷惑于 exports 和 module.exports 的区别,为了更好的理解 expo...
    99+
    2022-06-04
    详解 区别 exports
  • 详解Node.js中exports和module.exports的区别
    今天看了下node.js的require方法的源码,终于搞清楚exports和module.exports的区别了。 我们知道,node.js的模块暴露有两种方法。 1. 方式一:用exports /...
    99+
    2022-06-04
    详解 区别 Node
  • 一文详解Node中module.exports和exports区别
    目录一、当使用分别暴露时,module.exports和exports是一样的二、当使用统一暴露时,它俩是不一样的module.exports的统一暴露使用exports同一个暴露三...
    99+
    2023-03-09
    Node module.exports区别 module exports
  • Node.js 中exports 和 module.exports 的区别
    Node.js 中exports 和 module.exports 的区别 require 用来加载代码,而 exports 和 module.exports 则用来导出代码。但很多新手可能会迷惑于 exp...
    99+
    2022-06-04
    区别 js Node
  • Node中module.exports和exports区别是什么
    本篇内容介绍了“Node中module.exports和exports区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、当使用分别...
    99+
    2023-07-05
  • Node.js 中的 module.exports 与 exports区别介绍
    目录介绍示例从源码中理解通过示例理解示例一示例二示例三示例四小结介绍 module:每个模块中都有 module 对象,存放了当前模块相关的信息;module.e...
    99+
    2022-11-13
  • node.js中module.exports与exports用法上的区别
    Node.js 引入了模块(Module)概念,一个模块可以通过module.exports 或 exports 将函数、变量等导出,以使其它 JavaScript 脚本通过require() 函数引入并...
    99+
    2022-06-04
    区别 js node
  • 详解nodeJS中读写文件方法的区别
    导言:nodejs中所有与文件相关的操作都在fs模块中,而读写操作又是我们会经常用到的操作,nodejs的fs模块针对读操作为我们提供了readFile,read, createReadStream三个方法...
    99+
    2022-06-04
    详解 区别 文件
  • mybatis中#{}和${}的区别详解
    目录一、MyBatis中${}和#{}的区别1.1 ${}和#{}演示1.2 SQL注入问题1.3 ${}和#{}的区别1.4 #{}底层是如何防止SQL注入的?1.4.1 网上的答...
    99+
    2022-11-13
  • Servlet中/和/*的区别详解
    目录本文提纲版本约定✍正文点拨“市面上”的错误答案1、/用于Servlet,demo:这个urlPatterns是合法的。只不过它属于精确匹配,也就是说别看它中间有*,仍...
    99+
    2022-11-12
  • mysql中#{}和${}的区别详解
    #{}会将传入的数据当成一个字符串,会对自动传入的数据加一个双引号 order by #{userId}   这里假如userId = 111,那么解析成sql时...
    99+
    2022-11-13
  • 详解JS中? ?和?. 和||的区别
    目录1、 与 || 的区别2、 和 . 的区别1、 与 || 的区别 1)相同点: 和 || 的用法相同,都是前后是值,中间用符号连接,根据前面的值来判断最终是返回前面的值还是后面...
    99+
    2022-11-13
  • Java中equals和==的区别详解
    目录1.java中的数据类型,可分为两类: 2.再稍微改动一下程序,会有更奇怪的发现: 3. 字符串缓冲池 4.再次更改程序: 总结1.java中的数据类型,可分为两类: 1.基本...
    99+
    2022-11-12
  • JavaScript/TypeScript中==和===的区别详解
    在JS/TS项目里,除了能看到==操作符来判断两个变量是否相等外,我们还会看到===操作符,这两者有什么区别吗? 先上结论, 对于String, number这些基础类型,==操作符...
    99+
    2022-11-13
  • 详解Java中==和equals()的区别
    目录1. ==1.1 基本数据类型1.2 引用数据类型1.3 小结2. equals3. 总结1. == == 是运算符,用来判断两个值是否相等,==可以使用在基本数据类型变量和引用...
    99+
    2022-11-12
  • nodejs中path.join和path.resolve的有什么区别
    这篇文章主要讲解了“nodejs中path.join和path.resolve的有什么区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs中pat...
    99+
    2022-10-19
  • Java中Exception和Error的区别详解
    世界上存在永远不会出错的程序吗?也许这只会出现在程序员的梦中。随着编程语言和软件的诞生,异常情况就如影随形地纠缠着我们,只有正确的处理好意外情况,才能保证程序的可靠性。 java语...
    99+
    2022-11-12
  • java中StringStringBuffer和StringBuilder的区别详解
    目录从声明定义上来谈从结构上来谈从线程安全来谈总结从声明定义上来谈 只有String 可以 直接声明创建 而 StringBuffer 与 StringBuilder 必须去new...
    99+
    2022-11-13
  • Android中asset和raw的区别详解
    *res/raw和assets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。 *res/raw和assets的不同点: 1.res...
    99+
    2022-06-06
    asset Android
  • python中response.text 和response.content的区别详解
    1.response.text - 类型:str - 解码类型: 根据HTTP 头部对响应的编码作出有根据的推测,推测的文本编码 - 如何修改编码方式:response.encoding=”gbk” 2. respo...
    99+
    2022-06-02
    python response.text response.content
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作