首先说明他们是啥?

在CommonJS规范中,exports和module.exports这两个对象是把某一模块化文件中的属性和方法暴露给外部模块的接口(说法可能不准确),外部模块通过require引用返回的对象可调用module.exports中的属性和方法。

module.exports与exports的联系

1. 每一个node.js执行的模块化文件,都会自动创建一个module对象,module对象有一个叫exports的属性,module.exports 初始值为一个空对象 {} ,同时自动创建了一个exports对象,该对象也是一个空对象{},通过VSCode运行调试一段模块化文件代码,在Local变量中我们可以看到这个特点:

2. exports对象是指向的 module.exports 的引用,相当于 :exports = module.exports;

要导出该模块的属性或方法时,我们可以用点操作符给module.exports对象添加一对属性及属性值:

module.exports.test = test;

当然,我们也可以给exports添加,由于exports和module.exports指向同一块内存,就相当于该属性添加到module.exports上:

exports.test = test;

所以执行如下两句代码后,exports对象和module.exports对象会同步由一开始的空对象更新为 {a: 1, b: 2}

module.exports.a = 1;
exports.b = 2;

module.exports与exports的区别

在另一个模块引入该模块时,require() 返回的是 module.exports 而不是 exports。

所以我们不能直接用对象字面量给exports赋值,这样exports就指向了新的内存,切断了exports与module.exports之间的联系,这时exports和普通的对象就没有区别了,无法被导出:

exports = {
test: 1
}

如果要直接使用对象字面量,我们可以直接把它赋值给module.exports:

module.exports = {
test: 1
}

要注意,如果我们使用这种方式给module.exports赋值了,那再用点操作符给exports赋属性和属性值的方式就失效了,因为module.exports指向了新的内存区域,同样切断了和exports对象的联系。同样的,在此之前用点操作符给module.exports赋值的 语句也失效了,因为module.exports对象被新的对象字面量覆盖了。

module.exports与exports的联系与区别的更多相关文章

  1. node (02 CommonJs 和 Nodejs 中自定义模块)顺便讲讲module.exports和exports的区别 dependencies 与 devDependencies 之间的区别

    CommonJS 规范的提出,主要是为了弥补当前 JavaScript 没有标准的缺陷.它的终极目标就是:提供一个类似 Python,Ruby 和 Java 语言的标准库,而不只是停留在小脚本程序的阶 ...

  2. module.exports 、exports、export、export default的区别

    module.exports和exports是属于 CommonJS 模块规范,export和export default是属于ES6语法. module.exports和exports导出模块,用r ...

  3. module.exports和exports得区别

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

  4. 浅析module.exports和exports区别和使用

    module.exports和exports 写node的时候,特别是自定义模块的时候,都是一顿乱敲,然后module.exports={}完事. 但有时候去看别人写的代码的时候会发现还可以expor ...

  5. Module.exports和exports的区别

    原文链接: https://www.ycjcl.cc/2017/02/10/module-exportshe-exportsde-qu-bie/ 学习Seajs时,看到了exports.doSomet ...

  6. module中module.exports与exports的区别(转)

    转https://cnodejs.org/topic/55ccace5b25bd72150842c0a require 用来加载代码,而 exports 和 module.exports 则用来导出代 ...

  7. NodeJS2-3环境&调试----module.exports与exports的区别

    exports默认会给他设置为module.exports的快捷方式,可以把它的里面添加属性,但是我们不能修改它的指向,如果修改了它的指向那它和普通对象没有任何区别了.因为在CommonJS中,模块对 ...

  8. Node.js module.exports和exports的区别

    require 用来加载代码,而 exports 和 module.exports 则用来导出代码,从接触node.js就不会它们两陌生,上代码: foo.js exports.a = functio ...

  9. module.exports与exports区别

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

随机推荐

  1. python 中 \n 和转义r的作用和\r的实际应用

    我们先看看这张转义字符图: 1. 知识储备 \r 表示将光标的位置回退到本行的开头位置 \b 表示将光标的位置回退一位 在 python 语言中, 使用 print 打印输出时,默认是会进行换行的.如 ...

  2. RxJava 中的map与flatMap

    1.map和flatMap都是接受一个函数作为参数(Func1) 2.map函数只有一个参数,参数一般是Func1,Func1的<I,O>I,O模版分别为输入和输出值的类型,实现Func1 ...

  3. Porting QML Applications to Qt 5

    When porting QML-related code from Qt 4.8 to Qt 5, application developers should be aware that the Q ...

  4. springlog记录

    在servlet.xml加入 <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-aut ...

  5. /usr/lib64/python2.6/site-packages/cryptography/__init__.py:26: DeprecationWarning: Python 2.6 is no longer supported by the Python core team

    升级python2.6到2.7后,执行ansible后一直显示警告,如标题所示. 因为安装ansible,使用的是yum的方式,而yum使用的是python2.6,所以ansible安装环境为pyth ...

  6. tomcat 8 startup.bat启动乱码问题

    修改Tomcat bin目录下startup.bat文件 将call "%EXECUTABLE%" start %CMD_LINE_ARGS%  改为 call "%EX ...

  7. jemter多种方式查看结果树及正则的使用

    最近才发现jemter结果是有一种正则表达式匹配的显示方式,以前直接在TEXT下显示和来匹配正则,真是费时间,使用方式如下: 默认使用TEXT方式显示: 显示方式有以下几种: RegExp Teste ...

  8. 修改WSAD的默认工作区(转)

    如果要一直用某个目录作为工作区,可以在启动WSAD的时候将该目录设为默认工作区,这样启动时直接启动,方便.快捷.但是如果设置后在想换工作区就比较麻烦了,因为没有可供选择的界面了,跟网上搜了一下总结共有 ...

  9. Excel 移动列操作

  10. BIND简易教程(2):BIND视图配置

    目录:BIND简易教程(1):安装及基本配置BIND简易教程(2):BIND视图配置(本篇)BIND简易教程(3):DNSSec配置 上文书说到,我们把aaa.apple.tree解析到192.168 ...