2016-12-01 62 views
0

在Node.js的(CommonJS的模块系统),我们有传递数据需要功能

require('foo'); 

有没有办法将数据传递到模块,是这样的:

require('foo', {extra:'args'}); 

我d一旦加载,就希望能够在模块本身中设置一个值,并且我不能控制'foo'的结构 - 它可能会导出一个函数,或者整个模块可能会运行完成。

用例实际上是相当普遍的:

我有一个模块,像这样:

// foo.js

function bar(){ 


} 

if(x){  //if I could pass x as variable to the module, that would be useful 
bar(); 
} 

module.exports = bar; 

不幸的是,TMK,我必须设置一个全局变量来规定x的值,这总是很糟糕。

+0

如果你不能控制'foo'的结构,你怎么知道你的论点将意味着什么或做任何事情?我的意思是,答案是“不”。但如果你能更好地解释为什么你认为你需要这样做,我可以告诉你如何实现你的真正目标。 – Paul

+0

有点难以解释为什么这个功能会有用。它是API的一部分。我只是添加了一些细节。 –

+0

如果你足够长的时间了解Node.js,那么以前你会看到这种困境。也许有解决办法。 –

回答

2

自2009年以来,我一直在使用node.js,希望这足够长。 ;)

一般来说,你所要求的是不可能的,你问它的方式。正如你所描述的,我已经看到了四种配置模块的常用模式。

1)导出函数,将params传递给配置其选项的函数。这是迄今为止最常用的方法。

2)使用静态(功能或属性)。如果将模块视为Singleton,这是最常见的选项,并且这些选项是要应用于模块的所有实例的内容。但是由于全球化的状况,大多数人都回避这种做法。

3)环境变量。这是另一种非常常见的做法,并由12factor.net推荐。对于应用程序级别的变量来说最为常见,对于内部模块来说更是如此。

4)配置模块。在这种情况下,人们使用类似convict等的东西来整合来自其他文件(基于环境)和命令行参数以及环境变量的配置。需要配置的模块只需要这些模块,并询问他们关心的变量。

+0

感谢Paul,我从来没有怀疑过你使用Node的经验! :)基本上这是针对API的,在这种情况下,模块需要完全作为脚本执行,或者等待导出的函数在需要脚本之后被调用。我希望API的用户能够决定他们想要的执行类型。要求用户进行大量设置并使用全局变量或env变量总是很糟糕,我想,但让我再考虑一下你的答案。 –

+1

是的,我没有把它当作轻微的,但我忍不住回应。我建议在nodeverse中查看其他记录良好的API。一般来说,模式是在模块入口点传入一次选项,然后让它们在内部处理任何事情。但选择是关键;应该有几乎所有的智能默认设置。 – Paul