我知道我可以将module.exports
设置为对象或函数
(在某些情况下,还会返回一个返回对象的函数)。
我也了解使用exports
与module.exports
的不同之处和方式,因此无需对此发表评论。
我也理解返回的内容会被缓存,并会在对require
的任何连续调用中返回。因此,如果我选择返回一个函数而不是一个对象,那么可能这意味着在每个需要时都需要实际运行此函数。
我想知道是否有任何事实上的标准应该使用哪两个。或者,如果没有这样的标准 - 在决定我的模块是否应该返回一个对象,一个函数或任何更复杂的东西时会考虑哪些因素...
我打算编写的模块如果很重要,可以用作快速应用程序的一部分(可能有快速/连接模块的“本地事实标准”)。
答案 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之后调用它。