Node.js 渲染器中定义的电子变量在导入的模块中不正确
我目前正在将我在Node.js中编写的脚本转换为Electron。然而,我遇到了一个可变范围的问题。在my Node.js脚本中定义的变量在我的模块中不可用,除非它们被传递或分配。然而,在electron中,如果我声明一个变量,它将在我的所有模块中都可用,而无需传递或分配它。例如,此Node.js脚本将正确失败:Node.js 渲染器中定义的电子变量在导入的模块中不正确,node.js,electron,Node.js,Electron,我目前正在将我在Node.js中编写的脚本转换为Electron。然而,我遇到了一个可变范围的问题。在my Node.js脚本中定义的变量在我的模块中不可用,除非它们被传递或分配。然而,在electron中,如果我声明一个变量,它将在我的所有模块中都可用,而无需传递或分配它。例如,此Node.js脚本将正确失败: // index.js var myModule = require('./src/myModule.js'); var myString = 'string'; myModule.r
// 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>
您的原始nodejs文件应按预期工作:
//index.js
var myModule=require('./src/myModule.js');
var myString='string';
myModule.run();
//myModule.js
exports.run=函数(){
console.log(myString);//myString现在未定义
}
但您应该知道renderer.js中定义的变量仍将使用全局作用域。如何打包?我很惊讶,
require
起作用了……对我来说不起作用。@Codebling在创建浏览器窗口时,您是否确保nodeIntegration
设置为true
?默认情况下,它是false
。是的,可以!发射电子有几种不同的方法。直接运行脚本时,我无法复制。将type=“module”
添加到脚本标记中会出现错误:加载模块脚本失败:服务器响应的非JavaScript MIME类型为“”。根据HTML规范,对模块脚本执行严格的MIME类型检查。
我使用一个选项更新了注释,但没有使用type=module。我曾经对此进行过测试,您能提供有关您的环境和配置的信息吗?第一个答案很好,Hrun!通过浏览器框架加载的任何脚本都有一个奇怪的伪窗口
模块上下文,导致变量是全局变量,但任何其他模块都被包装在一个孤立的(也称为“真实”)模块上下文中。我可以确认这对meTurns有效,我运行的electron也过时了。更新到electron8.2.0
修复了脚本未加载的问题。添加type=“module”
会使我的代码按预期运行。悬赏让我在18小时内完成。