Javascript 如何在NodeJS中导入匿名闭包
我正在编写一个nodejs脚本(将在azure管道中使用),以检查我的Web开发人员是否忘记重新生成Web应用程序中使用的对象契约。 因此,目标是读取他的文件,并将其中的对象与存储在其他地方的最新对象版本进行比较 该文件在全局对象(浏览器中的窗口)中的匿名函数中附加一个子对象,如 我尝试了基于以下“vm”模块的解决方案: generatedModels.jsJavascript 如何在NodeJS中导入匿名闭包,javascript,node.js,Javascript,Node.js,我正在编写一个nodejs脚本(将在azure管道中使用),以检查我的Web开发人员是否忘记重新生成Web应用程序中使用的对象契约。 因此,目标是读取他的文件,并将其中的对象与存储在其他地方的最新对象版本进行比较 该文件在全局对象(浏览器中的窗口)中的匿名函数中附加一个子对象,如 我尝试了基于以下“vm”模块的解决方案: generatedModels.js /***************************/ /* AUTO GENERATED via T4 */ /*******
/***************************/
/* AUTO GENERATED via T4 */
/***************************/
(function(){
"use strict";
mynamespace = mynamespace || {};
mynamespace.factories = mynamespace.factories || {};
mynamespace.factories.models = mynamespace.factories.models || {};
mynamespace.factories.models.AdresseLibreModel_Factory = function() {
return {"CodePays":null,"ComplementAdresse":null, /*...*/};
};
})();
main.js
var vm = require("vm");
var fs = require("fs");
var data = fs.readFileSync("generatedModels.js");
var window = {};
vm.runInNewContext(data, window, "generatedModels.js");
似乎我不能使用全局对象。
它在“runInNewContext”期间总是失败
-->mynamespace未定义
在generatedModels.js:9:2
我如何像在浏览器中一样使用该文件?
如果需要,我可以修改T4模板以更改“generatedModels.js”文件的结构,但它仍然需要由浏览器使用。由于
mynamespace
全局变量应该存在,所以应该在沙箱中提供它:
var sandbox = { mynamespace: {} };
vm.runInNewContext(data, sandbox, "generatedModels.js");
在浏览器中计算脚本时,应存在全局脚本:
<script>
window.mynamespace = {};
</script>
<script src="generatedModels.js"></script>
window.mynamespace={};
在IIFE之外,确定您是在浏览器的上下文中运行(存在窗口
对象),还是在节点模块中运行
传递窗口
或模块。将
导出到IIFE中。然后修改该对象,而不是尝试创建隐式全局(在严格模式下是禁止的)
然后在浏览器中,您可以只访问window.mynamespace
,在节点中,您可以只访问const module=require(“./module”)
然后使用module.mynamespace
我找到了解决方案:
我被迫在每个mynamespace前面使用关键字this(我不太喜欢这个。。。
而main.js就变成了
var lib = require('./generatedModels')
console.log(lib.mynamespace.factories.models.AdresseLibreModel_Factory().CodePays);
var lib = require('./generatedModels')
console.log(lib.mynamespace.factories.models.AdresseLibreModel_Factory().CodePays);