我正在编写一个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”文件的结构,但浏览器仍需要使用它。
答案 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
对象)还是您是节点模块。
将window
或module.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);