【问题标题】:MicrosoftAjaxMinifier doesn't seem to remove "unreachable code"MicrosoftAjaxMinifier 似乎没有删除“无法访问的代码”
【发布时间】:2014-06-25 11:55:03
【问题描述】:

我在 ASP.Net 应用程序中将其与来自 nuget 的 BundleTransformerSystem.Web.Optimisation 一起使用。根据各种文档,这个minifier 应该“删除无法访问的代码”。我知道它不像 google 关闭(我目前无法使用)那样激进,但我什至无法让最简单的情况下工作,例如;

function foo() {
}

foo 不会从任何地方调用。我可以理解说这可能是一个导出函数的论点,但我看不到区分它的方法。我所有的 JS 代码都是串联的,所以如果我能找到正确的开关,它就能确定是否需要该功能。

我发现省略不必要代码的唯一方法是在 web.config 中为BundleTransformer 使用debugLookupList 属性,但这似乎是一把大锤来破解坚果。它不是很精细。

有没有人举例说明如何编写这个缩小器识别的所谓“无法访问的代码”?

这是test online的地方

【问题讨论】:

    标签: asp.net-mvc-4 minify microsoft-ajax-minifier bundletransformer


    【解决方案1】:

    我怀疑 minifier 是否有办法知道是否可以安全地删除全局定义的函数(因为它不知道完整的范围)。另一方面,它可能不会删除任何未使用的函数,并且可能只对无法访问的代码(即return 之后的代码)感兴趣。

    使用 JavaScript 模块模式,您未使用的私有函数很可能会被正确放置(尽管我没有对此进行测试)。在下面的示例中,minifier 应该只对删除名为 privateFunction 的函数有信心。它是否将未使用的函数视为无法访问的代码是另一回事。

    var AmazingModule = (function() {
        var module = {};
    
        function privateFunction() {
            // ..
        }
    
        module.otherFunction = function() {
            // ..
        };
    
        return module;
    }());
    
    function anotherFunction() {
        // ..
    }
    

    【讨论】:

    • 这是一个公平的观点,你上面的例子跳过了 privateFunction。我想我希望它会追逐调用图。我的代码是从 TypeScript 生成的,所以全部使用模块模式。根据您上面的示例(我在我的问题中添加了一个测试网址),无论我在哪里使用了 exports 关键字,我都不能指望它会删除这些功能。我希望它会查看是否有人调用了这些导出,但我认为它更像您的示例。一旦函数在全局范围内,它就不能被清理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 2015-05-13
    • 2011-06-23
    • 1970-01-01
    相关资源
    最近更新 更多