使用require将variablesdynamic分配给全局范围

我正在构build一个模块化的应用程序,并根据用户的喜好有一个configuration文件,以包括不同的模块

通常我会做类似的事情

var fs = require('fs'); 

但我从数组中获取所需的模块,所以对于每个需求我有一个脚本对象,看起来像这样

 { name:'fs', file:'fs', isGlobal:true } 

然后我dynamic地请求模块

 window[script.name] = require(script.file); 

这工作正常,如果我检查window.fs 。 但是,依赖于fs其他模块只能调用fs

我知道window.fsfs都应该解决,但是在node-webkit中,它们不是。

我试图找出一种方法来将var name直接包含在全局中。

当然,我不能使用var script.name = require(script.file); 因为这将设置script.name值,而不是全局variables。

对此有何build议?

注意:自从我上次使用node-webkit以来,它已经有几个版本了,但是我认为下面的内容仍然是准确的。 如果没关系,我倾向于将node-webkit缩写为nw。 🙂

我知道window.fs和fs都应该解决,但是在node-webkit中,它们不是。

在nw中, global是全局对象,而每个nw窗口都有它自己的window对象(除非你fork了nw)。 这可能有点混乱,因为使用nw devtools来创build一个全局的意愿实际上是在window上创build一个属性,所以假设你可以像在浏览器中一样创build全局variables也不是不合理的。 但是,这只是在nw的窗口上下文中运行的devtools的一个副作用。

但是,在nw的模块上下文中运行的代码甚至不能访问window但是可以正常访问global

这是在这里logging 。 前三段专门处理你的问题。 总之,你要确定你的代码运行在哪个上下文中。

节点的全局variables同时有一个简短的描述。

您可以通过跨环境的方式参考全局:

 var global = new Function("return this")(); global.fs = require('fs'); 

那么在任何时候你都可以通过简单的全局fsvariables来引用fs模块,而在浏览器环境中global就是window

不过,你应该重新考虑你的方法。 如上所述,与CJS风格一起工作的方式非常差。 CJS的一个优点是它可以让你不依赖于全球范围,而你却反对这个问题。

另外,解决传递给dynamic需要的path是一个不好的做法。 在使用ES6的模块中,这是不可能的,您应该总是使用普通的string,并且遵循CJS也是很好的做法。 如果您生成脚本来注入普通string以满足要求,那将来会更具防弹性。