如何在NodeJS中导入匿名闭包

时间:2019-04-03 15:22:18

标签: javascript node.js

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

文件在匿名函数之类的全局对象(浏览器窗口)中附加一个子对象 https://medium.com/@tkssharma/javascript-module-pattern-b4b5012ada9f

我在以下找到的“ vm”模块上尝试了该解决方案:Load "Vanilla" Javascript Libraries into Node.js

generatedModels.js

.as-console-wrapper { max-height: 100% !important; top: 0; }

main.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, /*...*/};
    };  
})();

似乎我不能使用全局对象。 它总是在“ runInNewContext”期间失败 -> 未定义我的名字空间     在generateModels.js:9:2

如何像浏览器中那样使用该文件? 如果需要,我可以修改T4模板以更改“ generatedModels.js”文件的结构,但浏览器仍需要使用它。

3 个答案:

答案 0 :(得分:1)

由于预期mynamespace全局变量存在,因此应在沙箱中提供它:

var sandbox = { mynamespace: {} };
vm.runInNewContext(data, sandbox, "generatedModels.js");

在浏览器中评估脚本时,应存在一个全局变量:

<script>
window.mynamespace = {};
</script>
<script src="generatedModels.js"></script>

答案 1 :(得分:0)

在IIFE之外,确定您是在浏览器的上下文中运行(存在window对象)还是您是节点模块。

windowmodule.exports传递到IIFE。然后修改该对象,而不是尝试创建一个隐式全局(在严格模式下禁止使用)。

(function(obj){
    "use strict";

    var mynamespace = obj.mynamespace || {};
    mynamespace.factories = mynamespace.factories || {};
    mynamespace.factories.models = mynamespace.factories.models || {};      

    mynamespace.factories.models.AdresseLibreModel_Factory = function() {
        return {"CodePays":null,"ComplementAdresse":null, /*...*/};
    };  

    obj.mynamespace = mynamespace;

})(typeof window !== "undefined" ? window : module.exports);

然后,在浏览器中,您仅可以访问window.mynamespace,而在节点中,您仅可以访问const module = require("./module");,然后使用module.mynamespace

答案 2 :(得分:0)

我找到了解决方案: https://code-maven.com/javascript-module-to-run-in-browser-and-in-node

我被迫在每个 mynamespace 前面使用关键字 this (我不太喜欢... 并且main.js刚刚成为

var lib = require('./generatedModels')
console.log(lib.mynamespace.factories.models.AdresseLibreModel_Factory().CodePays);