nodeJS / commonJS module.exports应该返回什么

时间:2013-07-26 09:58:22

标签: node.js express commonjs

我知道我可以将module.exports设置为对象或函数 (在某些情况下,还会返回一个返回对象的函数)。

我也了解使用exportsmodule.exports的不同之处和方式,因此无需对此发表评论。

我也理解返回的内容会被缓存,并会在对require的任何连续调用中返回。因此,如果我选择返回一个函数而不是一个对象,那么可能这意味着在每个需要时都需要实际运行此函数。

我想知道是否有任何事实上的标准应该使用哪两个。或者,如果没有这样的标准 - 在决定我的模块是否应该返回一个对象,一个函数或任何更复杂的东西时会考虑哪些因素...

我打算编写的模块如果很重要,可以用作快速应用程序的一部分(可能有快速/连接模块的“本地事实标准”)。

2 个答案:

答案 0 :(得分:1)

如果require'代码是独立的,并且不需要访问父代码中的任何对象,我export一个对象。

编辑 - 以上是我首选的方法。我只在需要将内容传递给模块时才执行以下操作,例如配置数据或我的数据库对象。我还没有找到一种更优雅的方法来让模块访问父项范围内的变量。

因此,为了将父对象传递给模块,我使用了一个函数:

//parent.js
var config = { DBname:'bar' };
var child = require('./child.js')(config);

//child.js
module.exports = function(cfg){
  var innerchild = {};
  innerchild.blah = function(){
    console.log(cfg.DBname); // this is out of scope unless you pass it in
  }
  return innerchild;
};

答案 1 :(得分:0)

  

“这样如果我选择返回一个函数而不是一个对象那么   这可能意味着在每一项要求都是必要的   实际上运行这个功能。“

是否返回单个函数或对象无关紧要。在任何情况下都不运行一个或多个函数。除非你明确这样做。

例如,考虑一个模块hello.js

exports = function () { return 'Hello'; };

您可以使用require来获取该功能:

var hello = require('hello');

如果要运行该函数,则需要显式调用它,如下所示:

var hello = require('hello')();

您写道,您希望确保您的功能只执行一次。直观地说,这可能会导致您编写hello.js,如下所示:

var hello = function () { return 'Hello'; };
exports = hello();

在这种情况下,你可以通过require:

存储来自hello的结果
var hello = require('hello');

但是:如果你这样做the export system may cache your module。在这种情况下,您不会从hello获得新的结果,而是获得缓存的值。这可能是也可能不是你想要的。如果要确保每次需要时都调用一个函数,则需要导出一个函数并在require之后调用它。