1. 原理解析

NodeJS中使用了CommonJS的模块化标准,Node内部提供一个Module构建函数。所有模块都是Module的实例。每个模块内部,都有一个module对象,代表当前模块。而这个module对象中,就存在一个成员 exports,该成员也是一个对象。也就是说,如果你需要对外导出成员,只需要把导出的成员挂载到 module.exports 上就可以了,最终module对象中会执行 retrun module.exports 将挂载的值返回给require的对象。

var module = {exports: {// 挂载的对象都放到这里}
}

所以,原理是你是可以这么写的

function add(a, b) {return a + b
}module.exports.add = add

运行结果也无报错

但是你会发现,这样做的话,每次都需要写那么长的一截 module.exports.xxx ,很麻烦,于是就引入一个 exports 变量 (注意:就只是个变量名,不是module里面的那个exports对象)
var exports = module.exports;
如果是学过指针或者对数据结构比较熟悉的同学,一看到这个代码就明白是怎么一回事了,它是一个引用传递,就只是把 exports 指向了和module.exports 的同一块内存空间。

因此,exports变量就可以向exports对象中添加方法或属性
也就是说exports.addmodule.exports.add 的作用是一样的。
而当你操作exports变量指向其他空间的时候,它就与exports对象断联了,比如说: exports = add,这个语句是直接将exports指向了add 方法的返回值

2. 用法区别

一般来说,导出多个成员可以沟通过使用多个 exports.xxx = xxx 或者使用一个 module.exports = {}的方式来实现,而导出单个成员时使用module.exports = xxx

你肯定很疑惑为什么说导出单个的时候使用 module.exports = xxx ?人家做exports变量不就是方便你使用的吗?你怎么辜负别人的好心?

举个例子你就明白了

还是上面的那个两数相加的案例,和上面不同的是,我直接写了module.exports = add 而不是 module.exports.add = add

function add(a, b) {return a + b
}module.exports = add

接下来我在另外一个文件中,导入这个文件,并调用它的add方法。

const wantAdd = require('./module')
console.log(wantAdd(1,2))

输出的结果为 3

而如果改成了 exports.add = add 的方式导出的话

const wantAdd = require('./module')// console.log(wantAdd(1,2))
console.log(wantAdd.add(1,2))

输出结果同样为3

那有什么不同呢? 聪明的你一定发现了,使用 module.exports = xxx 的时候,我调用 add 方法是直接通过 wantAdd(1, 2) 来实现的;而使用 exports.add = add 的时候,调用add方法需要通过 wantAdd.add(1, 2) 来实现的。
原理就是由于module.exports = xxx是直接导出了 exports对象,也就说exports对象就是add方法;而exports.add = add 相当于 module.exports.add = add ,是在 exports 中新加了一个变量去指向 add 方法,所以你用wantAdd变量接收exports对象时,还需要调用 add 变量去使用到 add方法。
所以在导出单个的时候,使用 module.exports 会更方便些。

总结

exports 与 module.exports 本是同根生,在用法上稍稍不同,原理上也比较简单易懂。exports.xxx = xxx 在传递多个对象的时候,写法看起来优雅一些,算是一种快捷方式。若你实在是感受不到 exports 的好处或者分不清 exports变量与module.exports的区别,那你就使用module.exports 就好了,绝对不会有问题的。

module.exports 与 exports.xxx 的区别相关推荐

  1. module是什么类型_nodejs中module.exports和exports的区别

    本文同步发表在我的个人博客中: 沧沧凉凉​www.cclliang.com 最近在学习nodejs,这篇文章就权当是一篇笔记,如果有什么地方有误,望指出. 先说说它们之间的区别: exports只能使 ...

  2. module.exports和exports得区别

    对module.exports和exports的一些理解 可能是有史以来最简单通俗易懂的有关Module.exports和exports区别的文章了. exports = module.exports ...

  3. nodejs中module.exports和exports的区别

    最近在学习nodejs,这篇文章就权当是一篇笔记,如果有什么地方有误,望指出. 首先我们要明白一个前提,CommonJS模块规范和ES6模块规范完全是两种不同的概念. CommonJS模块规范 Com ...

  4. 一句话说清楚NodeJS中module.exports和exports的区别

    关于这个问题NodeJS的官方文档中有一句很精辟的解释: What's the difference between module.exports and exports? The first exp ...

  5. module.exports与exports,export与export default之间的关系和区别

    CommonJS模块规范和ES6模块规范完全是两种不同的概念. CommonJS模块规范: 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文 ...

  6. module.exports 和 exports的区别

    在模块化规范中commonjs大部分用于node.js中,而commonjs中的导出方式分为两种 module.exports 和 exports,那么这两种具体有哪些区别呢?请往下看 CommonJ ...

  7. module.exports 和 exports 、export default 、export、require 、 inport 的区别

    module.exports 和 exports 的区别(不完全理解exports 实际操作有出入) module.export 和exports 是node.js 的语法 , 而export def ...

  8. module.export和exports两者区别及使用方法

    参考链接:简书博客.简书博客.CommonJS规范 功能介绍 module.exports Node应用由模块组成,采用CommonJS模块规范.根据这个规范,每个文件就是一个模块,有自己的作用域.在 ...

  9. (区别、详解、使用)module.exports与exports,export与export default,import 与require

    目录 导出简介(里面有小细节请仔细阅读) module.exports与exports 1.该js文件要导出的值即为test 2.该js文件要导出的值即为test1和test2 3. 注意这里我是先给 ...

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

    (node中使用)module.exports 和exports的区别是什么? 用一句话来说明就是,require只会去引用module.exports这个对象的导出,不会引用exports对象的,而 ...

最新文章

  1. mysql5.7.20安装红黑_Window环境安装MySQLServer5.7.21
  2. 网络推广产品浅析网站想要保持稳定的SEO排名和流量需要做什么?
  3. Boost:基于Boost的发送者和接收者的测试程序
  4. 下载kaggle数据集的小妙招
  5. linux下为PHP扩展安装memcache模块
  6. UVa12166 Equilibrium Mobile修改天平(二叉树+dfs)
  7. eclipse 使用指南
  8. 在html设置文字位置,html设置怎么文字的位置
  9. react router 4
  10. UVA10570 Meeting with Aliens【数学计算】
  11. PHP编写时的灵活性
  12. 信号与系统研讨(一)匹配滤波器
  13. linux中nginx的nginx.config文件的配置和启动(包括重启)
  14. android投影到创维电视,创维Miracast,手机怎么投屏到创维电视,
  15. 百科园c语言题库13164,C语言题库-编程
  16. pyhotn的p2p-sip网络电话小试牛刀
  17. Datagrid Bind DropDownlist.....
  18. Joel Spolsky在耶鲁大学的演讲
  19. OPENWRT路由器设置
  20. 下一代计算机网络技术指什么,下一代计算机网络技术

热门文章

  1. 常用好的网址汇总(个人喜欢的)
  2. OpenCV学习常用网址
  3. 回归预测分析(RANSAC、多项式回归、残差图、随机森林)
  4. 【ZigBee 系列】| 网关的构成?用 JN51X9 的案例来讲解框架及各部分的功能
  5. Bitmap 贴图加工成 PBR 贴图
  6. 机器人制证系统大屏可视化
  7. vim复制、粘贴以及配置总结
  8. oracle存储过程入门教程
  9. Java 轮询(重发)机制
  10. 将十进制数转换成二进制数(C语言)