Nodejs中module.exports = Hello 和exports.Hello = Hello 什么区别?
Nodejs中module.exports = Hello 和exports.Hello = Hello 什么区别?
function Hello(){ var name ; this.setName = function(thyName){ name = thyName ; }; this.sayHello = function(){ console.log(‘Hello’+name); }; }
Node.js 中 module.exports
和 exports
的区别
在 Node.js 中,模块系统允许我们创建和导出功能强大的工具。module.exports
和 exports
是两个关键概念,它们在导出模块时起着重要作用。本文将通过一个具体的例子来解释这两者的区别。
示例代码
假设我们有一个名为 hello.js
的文件,其中包含一个名为 Hello
的构造函数:
// hello.js
function Hello() {
var name;
this.setName = function (thyName) {
name = thyName;
};
this.sayHello = function () {
console.log('Hello ' + name);
};
}
// 导出方式1: 使用 module.exports
module.exports = Hello;
// 或者导出方式2: 使用 exports
// exports.Hello = Hello;
如何使用这些导出的模块
我们可以在一个新的文件(例如 app.js
)中导入并使用这些模块:
// app.js
const Hello = require('./hello');
const myHello = new Hello();
myHello.setName('World');
myHello.sayHello(); // 输出: Hello World
区别说明
-
module.exports
:- 当你直接赋值给
module.exports
时,你实际上覆盖了整个模块的导出对象。 - 在上面的例子中,
module.exports = Hello;
将Hello
函数作为模块的唯一导出对象。
- 当你直接赋值给
-
exports
:exports
是module.exports
的引用,你可以通过它添加属性或方法到导出对象。- 如果你注释掉
module.exports = Hello;
并取消注释exports.Hello = Hello;
,那么Hello
构造函数将会被添加为exports
对象的一个属性。 - 这意味着在
app.js
中,你需要这样访问它:const { Hello } = require('./hello');
总结
module.exports
用于完全替换模块的导出对象。exports
用于向模块的导出对象添加属性或方法。
通过这种方式,你可以更灵活地组织和导出你的模块,使其在不同的上下文中更加易用。
比如你的文件叫做hello.js
如果是前者,那么
var hello = require('hello.js');
// use function Hello
hello();
如果是后者,那么
var hello = require(`hello.js`);
// use function Hello
hello.Hello();
才看到Hello是一个构造函数。。。注释写的有问题,不过应该不影响理解。
这里借鉴一段深入浅出NodeJS
中的一段话:
Node中的模块系统主要借鉴CommonJS的Modules规范,Node能以一种比较成熟的姿态出现,离不开CommonJS规
范的影响。
CommonJS中模块的定义:
在模块中,上下文提供require()方法来引入外部模块。对应引入的功能,上下文提供了exports对象用于导
出当前模块的方法或者变量,并且它是唯一导出的出口。在模块中,还存在一个module对象,它代表模块
本身,而exports是module的属性。在Node中一个文件就是一个模块,将方法挂载在exports对象上作为属
性即可一定导出的方式。
在Node.js中,module.exports
和exports
都可以用来导出模块,但它们之间有一些细微的区别。
区别
-
module.exports
module.exports
是一个对象,你可以直接赋值给它。这种方式会完全替换当前的导出对象。- 例如,如果你写
module.exports = Hello;
,你将整个Hello
函数对象导出为模块的默认导出。
-
exports
exports
实际上是module.exports
的引用,因此你可以在不改变引用的情况下向其添加属性。- 例如,
exports.Hello = Hello;
相当于module.exports.Hello = Hello;
。这会向模块的导出对象添加一个名为Hello
的属性。
示例代码
假设我们有一个文件 myModule.js
:
// myModule.js
function Hello() {
var name;
this.setName = function (thyName) {
name = thyName;
};
this.sayHello = function () {
console.log('Hello ' + name);
};
}
// 使用 module.exports 完全替换导出对象
module.exports = Hello;
// 或者使用 exports 添加属性
// exports.Hello = Hello;
使用导出模块
// main.js
const Hello = require('./myModule');
let helloInstance = new Hello();
helloInstance.setName('Alice');
helloInstance.sayHello(); // 输出: Hello Alice
在这个例子中,Hello
函数对象通过 module.exports
导出,并在 main.js
中被正确加载和使用。如果使用 exports.Hello = Hello;
,你需要通过 require
语句来访问 Hello
属性,如下所示:
// main.js
const myModule = require('./myModule');
let helloInstance = new myModule.Hello();
helloInstance.setName('Alice');
helloInstance.sayHello(); // 输出: Hello Alice
总结来说,module.exports
和 exports
的主要区别在于 module.exports
可以完全替换导出对象,而 exports
更像是一个工具,可以向现有的导出对象添加更多的属性或方法。