我正在构建一个模块化应用程序,并根据用户首选项配置一个包含不同模块的配置文件。
通常我会做像
这样的事情var fs = require('fs');
但我从数组中获取所需的模块,因此对于每个需要我都有一个看起来像这样的脚本对象
{
name:'fs',
file:'fs',
isGlobal:true
}
然后我用
动态请求模块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值,而不是全局变量。
对此有何建议?
答案 0 :(得分:2)
您可以参考全局交叉环境:
var global = new Function("return this")();
global.fs = require('fs');
然后,您可以通过简单的全局fs
变量引用fs模块,在浏览器环境中global
将window
。
不过,你应该重新考虑你的方法。以上是使用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。