Javascript 如何在NodeJS中导入匿名闭包

Javascript 如何在NodeJS中导入匿名闭包,javascript,node.js,Javascript,Node.js,我正在编写一个nodejs脚本(将在azure管道中使用),以检查我的Web开发人员是否忘记重新生成Web应用程序中使用的对象契约。 因此,目标是读取他的文件,并将其中的对象与存储在其他地方的最新对象版本进行比较 该文件在全局对象(浏览器中的窗口)中的匿名函数中附加一个子对象,如 我尝试了基于以下“vm”模块的解决方案: generatedModels.js /***************************/ /* AUTO GENERATED via T4 */ /*******

我正在编写一个nodejs脚本(将在azure管道中使用),以检查我的Web开发人员是否忘记重新生成Web应用程序中使用的对象契约。 因此,目标是读取他的文件,并将其中的对象与存储在其他地方的最新对象版本进行比较

该文件在全局对象(浏览器中的窗口)中的匿名函数中附加一个子对象,如

我尝试了基于以下“vm”模块的解决方案:

generatedModels.js

/***************************/
/*  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);