使用require将变量动态分配给全局范围

时间:2014-02-04 06:44:12

标签: javascript node.js require node-webkit

我正在构建一个模块化应用程序,并根据用户首选项配置一个包含不同模块的配置文件。

通常我会做像

这样的事情
var fs = require('fs');

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

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

然后我用

动态请求模块
window[script.name] = require(script.file);

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

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

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

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

对此有何建议?

2 个答案:

答案 0 :(得分:2)

您可以参考全局交叉环境:

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

然后,您可以通过简单的全局fs变量引用fs模块,在浏览器环境中globalwindow

不过,你应该重新考虑你的方法。以上是使用CJS风格的非常糟糕的方式。 CJS的优点之一是它允许你不依赖于全球范围,你反对这会引发问题。

另外,解决传递给动态需求的路径是一种不好的做法。在我们很快就会使用ES6的模块中,您将不可能使用普通字符串,并且最好也遵循CJS。如果你生成为需要注入普通字符串的脚本,那将是更加未来的防范。

答案 1 :(得分:1)

注意:自从我上次使用node-webkit以来,已有几个版本,但我认为以下内容仍然准确。我倾向于将node-webkit缩写为nw,如果可以的话。 :)

  

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

在nw中,global是全局对象,而每个nw窗口都有自己的window对象(除非你是新的)。这可能有点令人困惑,因为使用nw devtools创建全局实际上会按预期在window上创建一个属性,因此假设您可以像在浏览器中一样创建全局变量并不是不合理的。然而,这实际上只是在nw的窗口环境中运行的devtools的副作用。

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

记录在案here。前三段专门处理您的问题。简而言之,您需要确定代码运行的上下文。

Node的全局变量同时具有(简要)描述here