yuglify JavaScript压缩器删除条件编译

时间:2013-01-17 14:14:22

标签: javascript conditional-compilation yui-compressor

我从https://github.com/yui/yuglify下载了Yahoo JavaScript Uglify(yuglify),我打算在apache服务器上托管的一些PHP项目中使用它来进行JS和CSS压缩。试图用这些原始内容缩小文件:

var _cmFrameList = new Array ();    // a pool of reusable iframes
var _cmFrameListSize = 0;           // keep track of the actual size
var _cmFrameIDCount = 0;            // keep track of the frame id
var _cmFrameMasking = true;         // use the frame masking

// disable iframe masking for IE7
/*@cc_on
    @if (@_jscript_version >= 5.6)
        if (_cmFrameMasking)
        {
            var v = navigator.appVersion;
            var i = v.indexOf ("MSIE ");
            if (i >= 0)
            {
                if (parseInt (navigator.appVersion.substring (i + 5)) >= 7)
                    _cmFrameMasking = false;
            }
        }
    @end
@*/

var _cmClicked = false;             // for onClick

但是得到了这个:

var _cmFrameList=new Array,_cmFrameListSize=0,_cmFrameIDCount=0,_cmFrameMasking=!0,_cmClicked=!1

在原始文件的内容中,有一些条件编译代码需要在较旧的IE浏览器上工作(以@cc_on,@ if,@ end等开头的注释行)。似乎yuglify将这些条件编译行视为简单注释,因此正在删除所有这些注释。

出于好奇,我也在同一个文件上测试了yuicompressor(https://github.com/yui/yuicompressor/downloads),似乎所有条件编译代码都是完整的。甚至线路仍然存在:

var _cmFrameList=new Array();var _cmFrameListSize=0;var _cmFrameIDCount=0;var _cmFrameMasking=true;
/*@cc_on
    @if (@_jscript_version >= 5.6)
        if (_cmFrameMasking)
        {
            var v = navigator.appVersion;
            var i = v.indexOf ("MSIE ");
            if (i >= 0)
            {
                if (parseInt (navigator.appVersion.substring (i + 5)) >= 7)
                    _cmFrameMasking = false;
            }
        }
    @end
@*/
var _cmClicked=false;

较旧的IE浏览器在没有这些条件编译行的情况下会出现乱码。是否可以在不删除的情况下使用yuglify?

1 个答案:

答案 0 :(得分:0)

通过使用eval命令进行一些解决方法,找到了解决问题的方法。

事实上,我创建了这些全局变量:

var is_IE_browser = eval('/*@cc_on !@*/false');
var jscript_version = (is_IE_browser) ? eval("/*@cc_on @_jscript_version @*/") : (0);
var IE_version = (is_IE_browser) ? (get_IE_version()) : (0);

然后,我创建了这个函数:

function get_IE_version(){
    var IE_version;
    if(jscript_version == 5.6 || (jscript_version == 5.7 && navigator.userAgent.toLowerCase().indexOf("msie 6.") != -1)) {
        IE_version = 6;
    } else if(jscript_version == 5.7){
        IE_version = 7;
    } else if(jscript_version == 5.8){
        IE_version = 8;
    } else if(jscript_version == 9){
        IE_version = 9;
    } else if(jscript_version == 10){
        IE_version = 10;
    } else {
        IE_version = 0;
    }
    return IE_version;
}

通过这样做,现在我可以使用上面的变量用一些条件替换所有条件编译代码(cc_on)。

如果浏览器是IE,变量“is_IE_browser”将返回true,否则返回false。

如果浏览器是IE,变量“IE_version”将返回IE版本号,否则返回零。

使用此代码,我可以可靠地检测大多数IE浏览器(IE6除外,它需要对浏览器用户代理数据进行一点搜索,并且它易受浏览器嗅探,但我可以忍受它)。

通过这种方式,我可以很好地检测旧浏览器,并继续使用yuglify而不会损坏我的JS文件。