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); }; }

5 回复

Node.js 中 module.exportsexports 的区别

在 Node.js 中,模块系统允许我们创建和导出功能强大的工具。module.exportsexports 是两个关键概念,它们在导出模块时起着重要作用。本文将通过一个具体的例子来解释这两者的区别。

示例代码

假设我们有一个名为 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

区别说明

  1. module.exports:

    • 当你直接赋值给 module.exports 时,你实际上覆盖了整个模块的导出对象。
    • 在上面的例子中,module.exports = Hello;Hello 函数作为模块的唯一导出对象。
  2. exports:

    • exportsmodule.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.exportsexports都可以用来导出模块,但它们之间有一些细微的区别。

区别

  1. module.exports

    • module.exports 是一个对象,你可以直接赋值给它。这种方式会完全替换当前的导出对象。
    • 例如,如果你写 module.exports = Hello;,你将整个 Hello 函数对象导出为模块的默认导出。
  2. 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.exportsexports 的主要区别在于 module.exports 可以完全替换导出对象,而 exports 更像是一个工具,可以向现有的导出对象添加更多的属性或方法。

回到顶部