1

我在一个ASP.Net应用程序中使用这个与BundleTransformer from nuget和System.Web.Optimisation。根据各种文档,minifier应该“删除无法访问的代码”。我知道这不像谷歌封闭(我目前无法使用)那么具有侵略性,但我甚至无法得到最简单的例子,例如:MicrosoftAjaxMinifier似乎没有删除“无法访问的代码”

function foo() { 
} 

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

我发现忽略不必要的代码的唯一方法是在web.config中使用debugLookupList属性BundleTransformer但这看起来像是一个大锤来破解一个螺母。它不是非常精细。

有没有人有如何编写所谓的“不可达代码”的例子,这个缩小器识别?

下面就来test online

回答

2

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

使用JavaScript模块模式,您的未使用的私人功能将很可能正确地恢复(虽然我没有测试过)。在下面的示例中,缩小器应该对删除名为privateFunction的函数有信心。它是否将未使用的函数视为不可达代码是另一回事。

var AmazingModule = (function() { 
    var module = {}; 

    function privateFunction() { 
     // .. 
    } 

    module.otherFunction = function() { 
     // .. 
    }; 

    return module; 
}()); 

function anotherFunction() { 
    // .. 
} 
+1

这是一个公平点,你的例子上面跳过privateFunction。我想我太希望它会追查通话图。我的代码是从TypeScript生成的,因此全部使用模块模式。根据上面的示例(我已经为我的问题添加了测试网址),无论我使用的是exports关键字,我都无法指望它删除这些函数。我希望看到这些出口是否被任何人叫到,但我认为它更像你的例子。一旦函数处于全局范围内,就无法清理。 – cirrus