Node.js module.exports 的用途是什么,你如何使用它?

新手上路,请多包涵

Node.js module.exports 的用途是什么,你如何使用它?

我似乎找不到任何关于此的信息,但它似乎是 Node.js 的一个相当重要的部分,因为我经常在源代码中看到它。

根据 Node.js 文档

模块

对当前的参考

module 。特别是 module.exports

与导出对象相同。看

src/node.js 了解更多信息。

但这并没有真正的帮助。

module.exports 究竟做了什么,一个简单的例子是什么?

原文由 mrwooster 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 784
2 个回答

module.exports 是实际作为 require 调用的结果返回的对象。

exports 变量最初设置为同一个对象(即它是一个简写“别名”),因此在模块代码中您通常会编写如下内容:

 let myFunc1 = function() { ... };
 let myFunc2 = function() { ... };
 exports.myFunc1 = myFunc1;
 exports.myFunc2 = myFunc2;

导出(或“公开”)内部范围函数 myFunc1myFunc2

在调用代码中,您将使用:

 const m = require('./mymodule');
 m.myFunc1();

最后一行显示 require 的结果如何(通常)只是一个可以访问其属性的普通对象。

注意:如果您覆盖 exports ,那么它将不再引用 module.exports 。因此,如果您希望为 exports 分配一个新对象(或函数引用),那么您还应该将该新对象分配给 module.exports


值得注意的是,添加到 exports 对象的名称不必与您要添加的值的模块内部范围名称相同,因此您可以:

 let myVeryLongInternalName = function() { ... };
 exports.shortName = myVeryLongInternalName;
 // add other objects, functions, as required

其次是:

 const m = require('./mymodule');
 m.shortName(); // invokes module.myVeryLongInternalName

原文由 Alnitak 发布,翻译遵循 CC BY-SA 4.0 许可协议

这已经得到回答,但我想补充一些说明……

您可以同时使用 exportsmodule.exports 将代码导入您的应用程序,如下所示:

var mycode = require('./path/to/mycode');

您将看到的基本用例(例如在 ExpressJS 示例代码中)是您在 .js 文件中的 exports 对象上设置属性,然后使用 require() 导入

因此,在一个简单的计数示例中,您可以:

(计数器.js):

 var count = 1;

exports.increment = function() {
    count++;
};

exports.getCount = function() {
    return count;
};

…然后在您的应用程序中(web.js 或任何其他 .js 文件):

 var counting = require('./counter.js');

console.log(counting.getCount()); // 1
counting.increment();
console.log(counting.getCount()); // 2

简单来说,您可以将所需文件视为返回单个对象的函数,您可以将属性(字符串、数字、数组、函数等)添加到返回的对象,方法是将它们设置为 exports .

有时您希望从 require() 调用返回的对象是一个您可以调用的函数,而不仅仅是一个具有属性的对象。在这种情况下,您还需要设置 module.exports ,如下所示:

(说你好.js):

 module.exports = exports = function() {
    console.log("Hello World!");
};

(应用程序.js):

 var sayHello = require('./sayhello.js');
sayHello(); // "Hello World!"

exports 和 module.exports 之间的区别在 此处的答案 中得到了更好的解释。

原文由 Jed Watson 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题