关于nodejs
nodejs是JavaScript的运行时环境,它既不是语言也不是框架。nodejs是后台开发的一个工具。
前端开发的JavaScript:
- ES语法
- DOM
- BOM
nodejs中JavaScript:
- ES语法
- 没有BOM和DOM
nodejs中的模块导出
示例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实际上是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对象。