使用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.fs
和fs
都应该解决,但是在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');
那么在任何时候你都可以通过简单的全局fs
variables来引用fs模块,而在浏览器环境中global
就是window
。
不过,你应该重新考虑你的方法。 如上所述,与CJS风格一起工作的方式非常差。 CJS的一个优点是它可以让你不依赖于全球范围,而你却反对这个问题。
另外,解决传递给dynamic需要的path是一个不好的做法。 在使用ES6的模块中,这是不可能的,您应该总是使用普通的string,并且遵循CJS也是很好的做法。 如果您生成脚本来注入普通string以满足要求,那将来会更具防弹性。