渲染器中定义的Electron变量在导入的模块中不正确



我目前正在将Node.js中制作的脚本转换为Electron。然而,我遇到了一个可变范围的问题。Node.js脚本中定义的变量在我的模块中不可用,除非它们被传递或分配。然而,在电子中,如果我声明一个变量,它将在我的所有模块中都可用,而无需传递或分配它。例如,这个Node.js脚本将正确失败:

// index.js
var myModule = require('./src/myModule.js');
var myString = 'string';
myModule.run();
// myModule.js
exports.run = function() {
console.log(myString); // Correctly says myString is undefined because it is not declared in myModule.js
}

然而,Electron中的相同代码将打印renderer.js:中定义的变量

// renderer.js
var myModule = require('./src/myModule.js');
var myString = 'string';
myModule.run();
// myModule.js
exports.run = function() {
console.log(myString); // Prints 'string' even though it is not declared in myModule.js
}

如何防止renderer.js中定义的变量在我的模块中可用。我发现它让我很容易创建无组织的代码。

您需要将脚本的类型定义为html中的模块。

<script type="module" src="./renderer.js"></script>

否则,render.js将使用全局作用域来保存您的变量,这就是为什么它在您的示例中可用于myModule.js的原因。

但您也可以注意到,myModules.js中定义的变量将使用本地作用域,正如您所期望的那样。这是因为只有通过标记加载的脚本才会使用全局作用域。

因此,另一种选择是创建一个render.js,它只包含

// renderer.js
require('./index.js');

并且您的原始nodejs文件应该按预期工作:

// index.js
var myModule = require('./src/myModule.js');
var myString = 'string';
myModule.run();
// myModule.js
exports.run = function() {
console.log(myString); // myString is now undefined
}

但您应该注意,render.js内部定义的变量仍将使用全局范围。

最新更新