我正在对现有的Angular 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 serve
本地文件,页面按预期工作。当我提供dist或UAT构建(两者都包括uglify任务)时,调用上述函数的站点区域无法正确呈现。
我已将此跟踪到下面的uglified版本:
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'
分别更改为“"undefined"!==typeof window.external'
和'"undefined"!==typeof window.external.Handle'
可以解决问题,并且可以在所有实例中正确呈现页面。
我可以看到为什么 uglify 试图以这种方式简化代码但是认为这样做是错误的 - 它不会将字符串“undefined”视为其输出中的字符串(应用程序)有一些怪癖,将返回字符串而不是关键字/布尔值),从而打破了代码。我该如何阻止它这样做?
答案 0 :(得分:0)
在做了一些更多的研究之后,我遇到了this question,它提供了一种更简洁的方法来检查产品内功能是否存在。
使用建议的检查不仅可以使代码更清晰,而且可以毫无问题地进行检查。适应我的问题,代码如下:
function isIsProduct() {
return ('Handle' in window.external);
}