详解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 相关文章推荐
jQuery 1.8 Release版本发布了
Aug 14 Javascript
Jquery 表单验证类介绍与实例
Jun 09 Javascript
JavaScrip实现PHP print_r的数功能(三种方法)
Nov 12 Javascript
jQuery实现首页图片淡入淡出效果的方法
Jun 10 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
Feb 14 Javascript
ES6下React组件的写法示例代码
May 04 Javascript
Vue.js添加组件操作示例
Jun 13 Javascript
Vue中"This dependency was not found"问题的解决方法
Jun 19 Javascript
vue 实现axios拦截、页面跳转和token 验证
Jul 17 Javascript
vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置)
Apr 12 Javascript
vue实现表格过滤功能
Sep 27 Javascript
js实现旋转的星空效果
Nov 01 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
短波收音机简介
2021/03/01 无线电
php session处理的定制
2009/03/16 PHP
php购物网站支付paypal使用方法
2010/11/28 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
Google Suggest ;-) 基于js的动态下拉菜单
2006/10/11 Javascript
读jQuery之十三 添加事件和删除事件的核心方法
2011/08/23 Javascript
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
2014/03/19 Javascript
jQuery过滤选择器详解
2015/01/13 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
2015/11/25 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
JS中数组重排序方法
2016/11/11 Javascript
Bootstrap modal只加载一次数据的解决办法(推荐)
2017/11/24 Javascript
Angular事件之不同组件间传递数据的方法
2018/11/15 Javascript
使用javascript做时间倒数读秒功能的实例
2019/01/23 Javascript
小程序click-scroll组件设计
2019/06/18 Javascript
JavaScript实现与web通信的方法详解
2020/08/07 Javascript
[02:38]2018DOTA2亚洲邀请赛赛前采访-VGJ.T
2018/04/03 DOTA
python实现自动重启本程序的方法
2015/07/09 Python
简单解决Python文件中文编码问题
2015/11/22 Python
Python实现针对中文排序的方法
2017/05/09 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
2017/09/08 Python
使用pygame模块编写贪吃蛇的实例讲解
2018/02/05 Python
Django 浅谈根据配置生成SQL语句的问题
2018/05/29 Python
Python 中Django验证码功能的实现代码
2019/06/20 Python
python实现串口自动触发工作的示例
2019/07/02 Python
Python requests获取网页常用方法解析
2020/02/20 Python
HTML5网页音乐播放器的示例代码
2017/11/09 HTML / CSS
洗发露广告词
2014/03/14 职场文书
入党思想汇报怎么写
2014/04/03 职场文书
个人授权委托书
2014/09/15 职场文书
纪委书记群众路线整改措施思想汇报
2014/10/09 职场文书
公安机关查摆剖析材料
2014/10/10 职场文书
廉洁自律承诺书范文
2015/04/28 职场文书
2016年春季运动会广播稿
2015/08/19 职场文书
小程序与后端Java接口交互实现HelloWorld入门
2021/07/09 Java/Android