exports是module.exports的引用,即var exports = module.exports。在一个模块的开头,这两个值都指向同一个空对象:exports = module.exports={}。所以,exports只是后者的引用。这篇文章中,我们将通过三个例子,探究这两者的关系和区别。

一. 模块默认返回的是module.exports,即便你在自定义的模块中明确写出return exports,真正返回的仍然是module.exports。例如:

//a.js

var a =100;
exports=a;//module.exports={}, exports=a
return exports;//明确写出返回exports

刚开始的时候,exports和module.exports相等(值是空对象的地址),但是后来exports又被赋值了一个变量a(值等于a),这样exports和module.exports就不是一回事了(给对象的引用赋值,不会改变原来的对象)。

//b.js

var modA = require('./a');
console.log(modA) // {}

返回的是空对象,说明a.js返回的值是module.exports而不是exports。

二.在exports上添加属性也同样会添加在module.exports上:

var a=100;
exports.a = a;//相当于给exports/module.exports添加了一个属性a

这时候,给exports添加a属性,也就相当于给module.exports添加了a属性。

var modA = require("./a");
console.log(modA) //{a:100}//可以拿到exports上的a属性

三.只要直接给module.exports赋值,exports上的各种赋值就会失效

var a =100;
exports.a =a;//exports={a:a}, module.exports = {a:a}
module.exports = function(){
console.log("can be output")
} //module.exports指向新的内存空间,返回的是函数

从以上三个例子我们可以得到两点结论:

1. 模块输出默认是module.exports,

2. 一旦直接赋值给module.exports或者exports,它们就代表不同的变量,此情况下,只有对module.exports的赋值才能被正常输出。

理解node模块的exports和module.exports的更多相关文章

  1. (译)Node.js的模块-exports和module.exports

    原文标题:Node.js Module – exports vs module.exports 原文链接:http://www.hacksparrow.com/node-js-exports-vs-m ...

  2. node.js模块中exports和module.exports的区别

    Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. CommonJS规范规定 ...

  3. Node.js模块导出exports 和 module.exports 的区别

    原文: https://blog.csdn.net/Pwiling/article/details/51958693 每一个node.js执行文件,都自动创建一个module对象,同时,module对 ...

  4. nodejs模块中exports和module.exports的区别

    通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ ,这些核心模块被编译成二进制文件,可以require('模块名')去获取:核心 ...

  5. Node.js中exports与module.exports的区别

    原文:http://www.hacksparrow.com/node-js-exports-vs-module-exports.html 你肯定对Node.js模块中用来创建函数的exports对象很 ...

  6. nodeJS实战:自定义模块与引入,不同模块的函数传递及回调处理,exports与module.exports(基于nodejs6.2.0)

    前言:本文基于上一篇文章中的源代码进行改写,地址:http://blog.csdn.net/eguid_1/article/details/52182386 注意:为什么不用module.export ...

  7. Node.js之exports与module.exports

    每一个node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {} module.exports = {}; Node.js为了方 ...

  8. nodeJS学习(9)--- nodeJS模块:exports vs module.exports

    模块简介: 通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ 这些核心模块被编译成二进制文件,可以 require('模块名') ...

  9. node.js中的exports和module.exports

    不同的编程语言都有各自的代码组织和复用的方式,如.net.php中的命名空间,python中的import,ruby中的module等,来避免命名空间污染.一直都没搞清楚node中的exports和m ...

随机推荐

  1. 第七课第三节,T语言流程语句(版本5.0)

    for语句 for和while语句一样,都是用来做循环操作的,只是他们的使用方法不一样 (注:关键字,for,end) 执行流程图解: 实例代码: for(var i=0;i<20;i++) / ...

  2. svn使用(三)

    使用VisualSVN服务端,把已有的文件导入到服务端中 可以按以下步骤:

  3. table中td的空格

    1.css的方式去掉空格 .table{ border-collapse:collapse; border-spacing:0px; }

  4. Channel States

    Introduction A channel (a call) will go through many different states during its lifetime. Here we w ...

  5. Python之paramiko基础

    一.Paramiko模块 paramiko是一个自由和开放源码模块使用,实现SSH2协议安全(认证和加密)连接到远程计算机. 二.windwos下安装paramiko模块 #在DOS命令行执行如下命令 ...

  6. javascript createElement ttf

    var icon= document.createElement("a");icon.className="iconfont";icon.innerHTML=& ...

  7. Java 异步处理简单实践

    Java 异步处理简单实践 http://www.cnblogs.com/fangfan/p/4047932.html 同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异 ...

  8. IIS:开启GZIP压缩效率对比及部署方法

    HTTP压缩 HTTP压缩是在Web服务器和浏览器间传输压缩文本内容的方法.HTTP压缩采用通用的压缩算法如GZIP等压缩HTML.JavaScript或CSS文件.压缩的最大好处就是降低了网络传输的 ...

  9. 2015年10月TIOBE编程语言排行榜

    名副其实的月经贴.

  10. Unity2D多分辨率屏幕适配方案(转载)

    一下内容转自:http://imgtec.eetrend.com/forum/3992 此文将阐述一种简单有效的Unity2D多分辨率屏幕适配方案,该方案适用于基于原生开发的Unity2D游戏,即没有 ...