我正在对现有的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任务)时,调用上述函数的站点区域无法正确呈现。

我已将其追踪到以下丑化版本:

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”视为字符串(应用程序有一些怪癖,并且会返回字符串而不是关键字/ booleans),从而破坏了代码。我如何防止它这样做?

最佳答案

经过更多研究之后,我遇到了this question,它提供了一种更简洁的方法来检查产品内功能的存在。

使用建议的检查不仅可以使代码更简洁,而且可以毫无问题地丑化。适应我的问题,代码如下:

function isIsProduct() {
    return ('Handle' in window.external);
}

关于javascript - Grunt uglify将字符串“undefined”视为关键字undefined,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47136083/

10-09 08:15
查看更多