1

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

我也知道使用exportsvs.的差异和方式,module.exports所以无需对此发表评论。

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

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

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

4

2 回答 2

1

如果require'd 代码是独立的,并且不需要从父代码访问任何对象,则我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;
};
于 2013-07-26T14:37:10.410 回答
0

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

返回一个单独的函数还是一个对象都没有关系。在这两种情况下都不会运行一个(或多个)函数。除非你明确地这样做。

例如,考虑 a 模块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');

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

于 2013-07-26T10:03:56.000 回答