【问题标题】:yuglify JavaScript compressor removing conditional compilationyuglify JavaScript 压缩器移除条件编译
【发布时间】:2013-01-17 14:14:22
【问题描述】:

我从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 将这些条件编译行视为简单的 cmets,因此将其全部删除。

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

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 不移除就可以使用吗?

【问题讨论】:

    标签: javascript conditional-compilation yui-compressor


    【解决方案1】:

    通过使用 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 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 2011-12-06
      • 2012-11-08
      • 2013-01-12
      相关资源
      最近更新 更多