我正在对现有的 Angular SPA 进行更改,有时可以在应用程序的产品内浏览器中查看该 SPA。该应用程序在 window.external.Handle 上公开了多个函数,以允许页面与应用程序中的某些功能进行交互或从应用程序中提取详细信息(例如应用程序版本、许可证详细信息等)。
我有以下代码(可在另一个不使用 grunt-contrib-uglify 的网站上运行):
function isInProduct() {
if (typeof window.external !== undefined && typeof window.external !== "undefined") {
if (typeof window.external.Handle !== undefined && typeof window.external.Handle !== "undefined") {
alert('in-product')
return true;
} else {
return false;
}
} else {
return false;
}
}
如果我在本地grunt服务
文件,页面将按预期工作。当我提供 dist 或 UAT 构建(两者都包含 uglify 任务)时,调用上述函数的站点区域无法正确呈现。
我已经追踪到下面的丑陋版本:
function e(e,t){return{isInProduct:function(){return void 0!==window.external&&void 0!==typeof window.external&&void 0!==window.external.Handle&&void 0!==typeof window.external.Handle}
将 'void 0!==window.external'
和 'void 0!==window.external.Handle'
更改为 '“未定义”! ==typeof window.external'
和 '"undefined"!==typeof window.external.Handle'
分别解决了该问题,并且页面在所有实例中都能正确呈现。
我可以理解为什么 uglify 试图以这种方式简化代码,但相信这样做是不正确的 - 它不会将字符串“undefined”视为其输出中的字符串(应用程序有一些怪癖,会返回字符串而不是关键字/ bool 值),从而破坏代码。我如何防止它这样做?
最佳答案
做了更多研究后,我发现了 this question ,它提供了一种更简洁的方法来检查产品内函数是否存在。
使用建议的检查不仅可以生成更干净的代码,而且可以毫无问题地进行丑化。针对我的问题进行了调整,代码如下:
function isIsProduct() {
return ('Handle' in window.external);
}
关于javascript - Grunt uglify 将字符串 "undefined"视为关键字 undefined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47136083/