详解Node.js中exports和module.exports的区别


Posted in Javascript onApril 19, 2017

今天看了下node.js的require方法的源码,终于搞清楚exports和module.exports的区别了。

我们知道,node.js的模块暴露有两种方法。

1. 方式一:用exports

//a.js

 exports.log =function (str) {
  console.log(str);
}
//b.js

 var s = require("./a");
 s.log("哈哈哈哈");

2. 方式二:用module.exports

//a.js
 module.exports = function (str) {
    console.log(str);
 }

//b.js
 var s = require("./a");
 s("嘻嘻嘻嘻");

如果将第一种方式的exports按照第二种方式写成下面这样就会出错:

//a.js
 exports = function (str) {
  console.log(str);
}
//b.js

 var s = require("./a");
 s("哈哈哈哈");

exportsmodule.exports的初始值指向的是空对象,即{}。从源码可以看到,其实模块的require方法实质上是调用了_load方法,而_load方法,最终返回的是module.exports

详解Node.js中exports和module.exports的区别

详解Node.js中exports和module.exports的区别 

来分析一下出错的原因。

由于最开始的时候,exportsmodule.exports都指向同一个对象。

第一种方式,是在给这个空对象{}添加属性,又因为module.exports也是指向这个对象的,所以最终require方法返回的module.exports是指向了这个具有log方法的对象的,可以引用到模块。

第二种方式是让module.exports指向一片新的内存空间,exports指向的仍然是{},但是由于require方法返回的是module.exports,所以最终也能引入模块。

但是最后那种写法是让exports指向一片新的内存空间,module.exports指向的仍然还是{},那么最终require方法是将module.exports返回,所以会导致报错,说s不是一个function。

所以:

请牢记:require方法返回的是module.exports

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript创建命名空间(namespace)的最简实现
Dec 11 Javascript
犀利的js 函数集合
Jun 11 Javascript
javascript中Number对象的toString()方法分析
Dec 20 Javascript
javascript处理a标签超链接默认事件的方法
Jun 29 Javascript
JS基于FileSystemObject创建一个指定路径的TXT文本文件
Aug 05 Javascript
js图片轮播手动切换效果
Nov 10 Javascript
jquery无限级联下拉菜单简单实例演示
Nov 23 Javascript
Node.js连接MongoDB数据库产生的问题
Feb 08 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
Oct 27 jQuery
vue 全选与反选的实现方法(无Bug 新手看过来)
Feb 09 Javascript
vue-router 源码之实现一个简单的 vue-router
Jul 02 Javascript
解决vue-router路由拦截造成死循环问题
Aug 05 Javascript
jQuery ajax请求struts action实现异步刷新
Apr 19 #jQuery
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
Apr 19 #Javascript
微信小程序 登录的简单实现
Apr 19 #Javascript
微信小程序开发入门基础教程
Apr 19 #Javascript
微信小程序教程系列之视图层的条件渲染(10)
Apr 19 #Javascript
JS实现AES加密并与PHP互通的方法分析
Apr 19 #Javascript
vue2.0父子组件间通信的实现方法
Apr 19 #Javascript
You might like
php daodb插入、更新与删除数据
2009/03/19 PHP
php 传值赋值与引用赋值的区别
2010/12/29 PHP
PHP图片裁剪函数(保持图像不变形)
2014/05/04 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
js option删除代码集合
2008/11/12 Javascript
jQuery库与其他JS库冲突的解决办法
2010/02/07 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
做好七件事帮你提升jQuery的性能
2014/02/06 Javascript
JS小游戏之宇宙战机源码详解
2014/09/25 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
2015/02/28 Javascript
jquery实现input框获取焦点的方法
2017/02/06 Javascript
基于jQuery实现文字打印动态效果
2017/04/21 jQuery
15个顶级开源JavaScript框架和库
2018/10/10 Javascript
vue axios封装及API统一管理的方法
2019/04/18 Javascript
VUEX 数据持久化,刷新后重新获取的例子
2019/11/12 Javascript
js实现左右轮播图
2020/01/09 Javascript
vue 组件简介
2020/07/31 Javascript
vue实现折线图 可按时间查询
2020/08/21 Javascript
微信小程序获取当前时间及星期几的实例代码
2020/09/20 Javascript
[01:05:24]Ti4 冒泡赛第二天 iG vs NEWBEE 3
2014/07/15 DOTA
Python编码时应该注意的几个情况
2013/03/04 Python
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
Python和Go语言的区别总结
2019/02/20 Python
python生成特定分布数的实例
2019/12/05 Python
python 实现检验33品种数据是否是正态分布
2019/12/09 Python
python实现堆排序的实例讲解
2020/02/21 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
2020/05/20 Python
python代码区分大小写吗
2020/06/17 Python
python如何删除文件、目录
2020/06/23 Python
Python paramiko使用方法代码汇总
2020/11/20 Python
爱尔兰橄榄球店:Irish Rugby Store
2019/12/05 全球购物
什么是托管函数?托管函数有什么用?
2014/06/15 面试题
2015年城管个人工作总结范文
2015/04/20 职场文书
每日六道java新手入门面试题,通往自由的道路
2021/06/30 Java/Android
使用Spring处理x-www-form-urlencoded方式
2021/11/02 Java/Android