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