Node.js是一种基于Chrome V8引擎的让JavaScript运行在服务端的编程语言,它可以使用模块和包的方式,方便地组织程序并管理依赖。其中module.exports
和exports
是模块化中常用的概念,本文将介绍它们在Node.js中的用法。
module.exports和exports的关系
在Node.js中,每个文件就是一个独立的模块,想要在其它模块中使用该文件内部的变量和函数,需要将其导出。module.exports
和exports
这两个变量都可以进行导出操作。
在Node.js中,每个模块都有一个module
对象,该对象包含了模块的相关信息,其中就有一个exports
属性。exports
将要导出的变量或函数挂载在该属性上,然后通过require()
函数在外部引用该模块并调用其导出的变量和函数。
默认情况下,exports
指向的是module.exports
的引用,所以通过exports
和module.exports
都可以进行模块导出,但是需要注意的是,二者的指向关系不是一直相同的,导致有时候我们需要使用module.exports
而不是exports
。
对比exports和module.exports
当我们使用exports
导出一个对象时,实际上是向exports
添加了一个属性并赋值。例如:
// add.js
exports.add = function (a, b) {
return a + b;
}
上述代码中,我们使用exports
将add()
方法导出。相当于执行了以下代码:
exports.add = function (a, b) {
return a + b;
}
module.exports = exports; // exports被默认指向module.exports
接下来让我们看一个示例:
// math.js
exports.add = function (a, b) {
return a + b;
};
exports.sub = function (a, b) {
return a - b;
};
// app.js
const math = require('./math');
console.log(math.add(1, 1)); // 2
console.log(math.sub(1, 1)); // 0
通过require()
函数引用math
模块并调用其导出的方法,结果正确输出。为什么是正确的呢?
我们知道exports
默认指向module.exports
,而当我们直接将exports
指向一个新的对象时,module.exports
的指向关系就已经被改变了。而Node.js在加载模块时,实际上返回的是module.exports
对象而不是exports
对象,所以将exports
指向一个新的对象后,再将该新对象作为module.exports
的值,才是真正的导出操作。
exports = {
add: function (a, b) {
return a + b;
},
sub: function (a, b) {
return a - b;
},
}
module.exports = exports;
注意:如果只是给exports
的属性重新赋值,并不会改变它和module.exports
之间的指向关系。
例如:
// multiply.js
exports = {
mul: function (a, b) {
return a * b;
}
}
// app.js
const multiply = require('./multiply');
console.log(multiply.mul(2, 5)); // TypeError: multiply.mul is not a function
在上述代码中,将exports
指向了一个新的对象,但是没有对其属性进行赋值,所以导出的值为undefined
,所以在调用时会出现TypeError。
exports和module.exports的使用场景
在大多数情况下,我们可以直接使用exports
进行模块导出。但是有时候,我们需要将模块直接导出一个函数或对象,而不是将它们挂载在exports
上,此时就需要使用module.exports
了。
例如:
// foo.js
module.exports = function () {
console.log('Hello World!')
}
// app.js
const foo = require('./foo');
foo(); // Hello World!
在上述代码中,直接将一个函数赋值给module.exports
,实际上是将该函数作为整个模块的导出对象。
小结
exports和module.exports都是Node.js中用于导出模块的变量,可以通过它们将模块的变量或函数暴露给外部使用,在使用的过程中,需要注意exports默认指向module.exports,其关系并非一直指向同一个对象,导致有时候我们需要使用module.exports而不是exports。在选用使用exports和module.exports导出模块的时候,可以根据实际情况进行选择。
以上就是nodejs exports用法的详细内容,更多请关注编程网其它相关文章!