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

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

我也意识到使用module.exportsmodule.exports的区别和方法,所以不需要评论。

我也明白,无论返回什么都caching,并将在任何连续的呼叫require返回。 所以,如果我select返回一个函数,而不是一个对象,那么这可能意味着每一个需求都需要实际运行这个函数。

我想知道是否有任何事实上的标准,哪两个应该使用。 或者,如果没有这样的标准 – 当决定我的模块是否应该返回一个对象,一个函数或者更复杂的东西时,需要考虑什么?

我打算编写的模块预计将被用作快速应用程序的一部分,如果它很重要的话(也许有一个“快速/连接模块的本地事实标准”)。

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

编辑 – 以上是我喜欢的方式来做到这一点。 我只在需要将东西传递到模块(如configuration数据或数据库对象)时执行以下操作。 我还没有find一个更优雅的方式让模块访问父母范围内的variables。

所以要传递一个父对象到模块我使用一个函数:

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

“所以如果我select返回一个函数而不是一个对象,那么这可能意味着每一个需求都需要实际运行这个函数。

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

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

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

你可以使用require来获得这个function:

 var hello = require('hello'); 

如果你想运行这个函数,你需要明确地调用它,如下所示:

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

你写了你想确保你的函数只执行一次。 直觉上,这可能会导致你编写你的hello.js ,如下所示:

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

在这种情况下,您可以通过require存储hello的结果:

 var hello = require('hello'); 

但是:如果你这样做, 出口系统可能会caching你的模块 。 在这种情况下,你不会从hello中获得新的结果,而是获得一个caching的值。 这可能是也可能不是你想要的。 如果你想确保一个函数在每次需要的时候被调用,你需要导出一个函数并在需要的时候调用它。