详解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 使用手册(四)
Sep 23 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
Oct 16 Javascript
JS实现匀速运动的代码实例
Nov 29 Javascript
node.js中的fs.chmodSync方法使用说明
Dec 18 Javascript
不同编码的页面表单数据乱码问题解决方法
Feb 15 Javascript
详解JavaScript中的forEach()方法的使用
Jun 08 Javascript
详解js中的apply与call的用法
Jul 30 Javascript
用js读写cookie的简单方法(推荐)
Aug 08 Javascript
js控住DOM实现发布微博效果
Aug 30 Javascript
vue中component组件的props使用详解
Sep 04 Javascript
解析vue路由异步组件和懒加载案例
Jun 08 Javascript
vue页面跳转实现页面缓存操作
Jul 22 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 Mysql编程之高级技巧
2008/08/27 PHP
PHP面向对象分析设计的经验原则
2008/09/20 PHP
浅析PHP程序设计中的MVC编程思想
2014/07/28 PHP
php中Y2K38的漏洞解决方法实例分析
2014/09/22 PHP
PHP单例模式详解及实例代码
2016/12/21 PHP
一个实用的php验证码类
2017/07/06 PHP
php实现微信分享朋友链接功能
2019/02/18 PHP
laravel-admin 实现在指定的相册下添加照片
2019/10/21 PHP
javascript学习笔记(九)javascript中的原型(prototype)及原型链的继承方式
2011/04/12 Javascript
JQuery中关于jquery.js与jquery.min.js的比较探讨
2013/05/15 Javascript
js中点击空白区域时文本框与隐藏层的显示与影藏问题
2013/08/26 Javascript
js抽奖实现随机抽奖代码效果
2013/12/02 Javascript
JS实现简单的顶部定时关闭层效果
2014/06/15 Javascript
JavaScript数组的栈方法与队列方法详解
2016/05/26 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
AngularJS学习笔记之表单验证功能实例详解
2017/07/06 Javascript
ReactNative页面跳转Navigator实现的示例代码
2017/08/02 Javascript
react native仿微信PopupWindow效果的实例代码
2017/08/07 Javascript
javascript基本常用排序算法解析
2017/09/27 Javascript
vue+webpack实现异步组件加载的方法
2018/02/03 Javascript
[41:56]Spirit vs Liquid Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
python中异常报错处理方法汇总
2016/11/20 Python
python图书管理系统
2020/04/05 Python
Python 中的Selenium异常处理实例代码
2018/05/03 Python
Python爬虫包BeautifulSoup简介与安装(一)
2018/06/17 Python
python把ipynb文件转换成pdf文件过程详解
2019/07/09 Python
python每天定时运行某程序代码
2019/08/16 Python
基于Python数据结构之递归与回溯搜索
2020/02/26 Python
非常震撼的纯CSS3人物行走动画
2016/02/24 HTML / CSS
如何用border-image实现文字气泡边框的示例代码
2020/01/21 HTML / CSS
html5表单及新增的改良元素详解
2016/06/07 HTML / CSS
英国婚礼商城:Wedding Mall
2019/11/02 全球购物
英语四级考试作弊检讨书
2014/09/29 职场文书
初中历史教学反思
2016/02/19 职场文书
python基础入门之普通操作与函数(三)
2021/06/13 Python
python脚本框架webpy的url映射详解
2021/11/20 Python