nodejs中使用exports与module.exports进行模块导出

关于nodejs

nodejs是JavaScript的运行时环境,它既不是语言也不是框架。nodejs是后台开发的一个工具。
前端开发的JavaScript:

  • ES语法
  • DOM
  • BOM

nodejs中JavaScript:

  • ES语法
  • 没有BOM和DOM

nodejs中的模块导出

  • module.exports

示例1:通常我们使用module.exports进行单个成员的导出,例如:

//在文件a.js中
var foo = 'helloWorld'
module.exports = foo

在另一个文件中通过require加载该模块,可以得到导出的成员

//同目录下的b.js中加载 a模块
var a = require('./a.js')

//输出
console.log(a)			//输出helloWorld

当然多个成员导出也能使用module.exports,这里我提供了两种方式

  • 示例2:用module.exports挂载成员进行导出,例如:
var foo='helloWorld'

var msg='123'
//将两个成员作为module.exports的成员进行挂载
module.exports.foo=foo
module.exports.msg=msg

在b.js中加载a.js模块

var a=require('./a.js')

console.log(a)   				//得到module.exports对象,有两个成员msg和foo
  • 示例3:module.exports直接导出对象
var foo='helloWorld'

var msg='123'

var msgs='111'
module.exports={
    foo:foo,
    msg:msg,
    msgs:msgs,
}

在b.js中可以的含有这三个属性的对象。

  • 解析

在模块加载的方法require中最终都会返回一个对象,它就是module.exports,所以加载的模块导出的成员都在module.exports中。
在示例1中,只导出一个成员,这其中module.exports实际上改变了指向,其指向大概如下图:
!
而示例2采用挂载方式导出多个成员,示意如下:
在这里插入图片描述
示例3使用module.exports直接对象导出多个成员,这其实与示例类似

在这里插入图片描述

  • 使用exports

exports实际上是module.export的引用,这也是为简化开发人的代码而提出的。

  • 示例4:使用exports多个成员导出
var foo='helloWorld'

var msg='123'

var msgs='111'
//导出多个成员,实际与示例2相似
exports.foo=foo
exports.msg=msg
exports.msgs=msgs

在b.js中加载可以得到包含这些导出成员的对象

  • 示例5:那是否可以用示例3或者示例1的方式导出成员呢?因为前文解释了示例1和示例3的原理是一样的,这里我用示例5验证我们疑问
var foo='helloWorld'

var msg='123'

var msgs='111'
//使用exports直接导出对象
exports={
    foo:foo,
    msg:msg,
    msgs:msgs
}

这是我们在b.js中加载a.js模块,只能得到一个空对象,说明成员导出失败!

  • 解析

前文我们提到了exports只是module.exports的一个引用,即它们指向同一块内存,当我们将exports指向一个新的内存地址时,它已经和module.exports没有任何关系了所以无法正常导出成员。
图示:
在这里插入图片描述
当exports改变指向时,
在这里插入图片描述

总结

本文解析了module.exports与exports的不同,实际上exports是module.exports的一个引用,当exports改变指向时,它就断绝了module.exports的关联,不会影响导出成员,所以之后无论怎么在exports上挂载成员也无法导出成员!因为在加载模块中使用的require方法会返回一个module.exports对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值