【问题标题】:Javascript minifier removes functionJavascript minifier 移除函数
【发布时间】:2015-03-31 17:36:01
【问题描述】:

我有一个 JS 文件,我正在尝试缩小它,但它遇到了一些问题。这是文件:

$(document).ready(function () {
function DisplayMessage(message, iserror) {
    var htmlclass = iserror ? "error" : "success";

    $('div.response-message').empty()
        .append(message)
        .addClass(htmlclass);

    $('div.response-message').animate({
        top: "-1px"
    }, 1000, function () {
        alert("donee");
    });
}

$('.account-overlay-link > a.link').click(function (e) {
    e.preventDefault();
    $('.account-overlay.background').removeClass("hide");
});

$('.account-overlay > .area > .close').click(function (e) {
    e.preventDefault();
    $('.account-overlay.background').addClass("hide");
});
});

如您所见,我在顶部有一个常规的 javascript 函数,在下面有两个 jQuery 事件处理程序。当我保存文件进行缩小时,缩小后的文件包含两个 jQuery 处理程序,但该函数无处可见。

奇怪的是,如果我删除了两个 jQuery 块但将函数保留在其中,文件仍然会缩小,但它是空白的(除了 (document).ready),就好像函数不存在一样。

我已尝试重新创建文件,重新启动 Visual Studios,但没有任何效果...

【问题讨论】:

    标签: javascript web-essentials


    【解决方案1】:

    “就绪”处理程序函数中的任何代码都不会调用您的函数,因此它会作为死代码被消除。无论如何,处理程序之外的任何东西都无法调用它。

    如果您希望函数成为全局可见的符号,则必须将其显式分配给 window 对象的属性:

    $(document).ready(function () {
    function DisplayMessage(message, iserror) {
        var htmlclass = iserror ? "error" : "success";
    
        $('div.response-message').empty()
            .append(message)
            .addClass(htmlclass);
    
        $('div.response-message').animate({
            top: "-1px"
        }, 1000, function () {
            alert("donee");
        });
    }
    window.DisplayMessage = DisplayMessage;
    

    如果你这样做,缩小器不会删除它。

    【讨论】:

    • 不幸的是,执行 window.DisplayMessage 并没有改变任何东西
    • @Frayt 你用的是什么缩小器?如果将函数引用复制到 window 属性并没有使其“活动”,我个人认为这是一个错误,但是您的缩小器可能要求您明确告诉它(通过特殊注释或其他内容)函数不应该t 被视为死代码。
    • @Frayt 还请注意,window.DisplayMessage = DisplayMessage; 需要在函数外部,而不是在内部。
    • Web Essentials 插件中包含的一个
    • @Frayt 作为一个实验,这可能有效:$("dummy").on("nothing", "*", DisplayMessage); - 如果最小化程序没有删除您的其他 jQuery 代码,它也应该不理会它 并且 它应该'不要删除该功能。 (但是,除非您也将其设置为 window 属性,否则该函数在“就绪”处理程序之外仍然不可见。)
    【解决方案2】:

    要记住的另一件事是,一些缩小器无法处理“特殊”关键字...

    考虑检查您的代码是否包含“花哨”的东西,例如

    • let, const
    • for(var a of myData) 这样的特殊循环
    • 特殊检查,例如 if("MyProperty" in myObject)

    至少在我的情况下,这是真正的问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 2018-03-23
      • 2013-04-16
      • 2012-03-13
      • 2017-12-08
      • 1970-01-01
      • 2012-01-10
      相关资源
      最近更新 更多