关灯
开启左侧

nodeJS中,exprots和module.exprots的详解

[复制链接]
老蚊子 发表于 2018-12-5 16:19:30 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
 
一般我们使用require 用来加载代码,而 exports和 module.exports 则用来导出代码
在Nodejs中,每一个node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {},module.exports = {};
Node.js在模块编译的过程中会对模块进行包装,最终会返回类似下面的代码:

  1. (function (exports, require, module, __filename, __dirname) {
  2.     // module code...
  3. });
复制代码

其中,module就是这个模块本身,require是对Node.js实现查找模块的模块Module._load实例的引用,__filename和__dirname是Node.js在查找该模块后找到的模块名称和模块绝对路径,这就是官方API里头这两个全局变量的来历。

区别模块内部是这样:exports = module.exports = {};
  • exports是module.exports的一个引用
  • require引用模块后,返回给调用者的是module.exports而不是exports
  • exports.xxx,相当于在导出对象上挂属性,该属性对调用模块直接可见
  • exports =相当于给exports对象重新赋值,调用模块不能访问exports对象及其属性
  • 如果此模块是一个类,就应该直接赋值module.exports,这样调用者就是一个类构造器,可以直接new实例
exports是引用 module.exports的值。module.exports 被改变的时候,exports不会被改变,而模块导出的时候,真正导出的执行是module.exports,而不是exports。
举例
  1. //1.js
  2. exports.a = function(){
  3.   console.log('a')
  4. }
  5. module.exports = {a: 2}
  6. exports.a = 1
  7. //运行这个文件

  8. //2.js
  9. var x = require('./1.js');
  10. console.log(x.a)
  11. //最后结果是 2
复制代码

最后
  • 对于要导出的属性,可以简单直接挂到exports对象上
  • 对于类,应该挂到module.exports对象上,不要和导出属性值混在一起



来源:https://www.jianshu.com/p/f7a09e5c21f7



 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


1关注

11粉丝

37帖子

排行榜
关闭

站长推荐上一条 /1 下一条

官方微信

全国服务热线:

400-0708-360

公司地址:国家西部信息安全产业基地(成都市高新区云华路333号)

邮编:610000    Email:2908503813@qq.com

Copyright   ©2015-2016  EOIT论坛Powered by©Discuz!    ( 蜀ICP备11000634号-7 )