Grunt uglify将字符串“undefined”视为关键字undefined

时间:2017-11-06 11:35:25

标签: javascript gruntjs grunt-contrib-uglify

我正在对现有的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”视为其输出中的字符串(应用程序)有一些怪癖,将返回字符串而不是关键字/布尔值),从而打破了代码。我该如何阻止它这样做?

1 个答案:

答案 0 :(得分:0)

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

使用建议的检查不仅可以使代码更清晰,而且可以毫无问题地进行检查。适应我的问题,代码如下:

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