在缩小javascript时,System.Web.Optimization会更改js文件的顺序

使用System.Web.Optimization缩小文件时,我观察到一种非常特殊的行为,我已经在使用IBundleOrderer ,当我没有缩小文件时,它可以很好地保存文件顺序

 public class RespectGivenBundleOrder : IBundleOrderer { public IEnumerable OrderFiles(BundleContext context, IEnumerable files) { return files; } } public static void RegisterTestingBundle(BundleCollection bundles) { var bundle = new ScriptBundle("~/OnTheMoveWebFiles/bundles/Testing"); bundle.Orderer = new RespectGivenBundleOrder(); bundle.Include( string.Format("{0}jquery-{{version}}.js", baseJSFolder), string.Format("{0}ua-parser.js", baseJSFolder), string.Format("{0}OnTheMove_Core.js", baseJSFolder), string.Format("{0}OnTheMove_TheApplication.js", baseJSFolder), string.Format("{0}OnTheMove_JQMQueryString.js", baseJSFolder), string.Format("{0}OnTheMove_OfflineAuditing.js", baseJSFolder), string.Format("{0}OnTheMove_DatabaseManager.js", baseJSFolder), string.Format("{0}OnTheMove.js", baseJSFolder), string.Format("{0}OnTheMove_Offline.js", baseJSFolder), string.Format("{0}OnTheMove_DatabaseLoader.js", baseJSFolder), string.Format("{0}OnTheMove_DatabaseTestHelper.js", baseJSFolder), string.Format("{0}OnTheMove_SmartScriptPlayer.js", baseJSFolder), string.Format("{0}jasmine.js", baseJSFolder), string.Format("{0}jasmine-html.js", baseJSFolder), string.Format("{0}jasmine-jquery-{{version}}.js", baseJSFolder), string.Format("{0}jasmine-OnTheMove-GenericMocksAndHelpers.js", baseJSFolder), string.Format("{0}jasmine-OnTheMove-DatabaseManager-SiebelToSQL-Tests.js", baseJSFolder), string.Format("{0}jasmine-OnTheMove-TreeValidator-Tests.js", baseJSFolder), string.Format("{0}jasmine-OnTheMove-GlobalFunction-Tests.js", baseJSFolder), string.Format("{0}jasmine-OnTheMove-OnTheMove_BusinessComponent-Tests.js", baseJSFolder), string.Format("{0}jasmine-OnTheMove_DatabaseTestHelper-Tests.js", baseJSFolder), string.Format("{0}jasmine-OnTheMove_OfflineAuditing-Tests.js", baseJSFolder), string.Format("{0}jasmine-OnTheMove-JQueryExtension-Tests.js", baseJSFolder)); bundles.Add(bundle); } 

但是当我确实开始缩小时我会收到javascript错误,并且通过检查chrome开发人员工具中缩小文件的开头,我可以立即看到该订单搞砸了。

在我执行var cont = new BundleResolver(BundleTable.Bundles ).GetBundleContents("~/OnTheMoveWebFiles/bundles/Testing")即时窗口中我得到

 Count = 23 [0]: "~/OnTheMoveWebFiles/js/jquery-1.7.1.js" [1]: "~/OnTheMoveWebFiles/js/ua-parser.js" [2]: "~/OnTheMoveWebFiles/js/OnTheMove_Core.js" [3]: "~/OnTheMoveWebFiles/js/OnTheMove_TheApplication.js" [4]: "~/OnTheMoveWebFiles/js/OnTheMove_JQMQueryString.js" [5]: "~/OnTheMoveWebFiles/js/OnTheMove_OfflineAuditing.js" [6]: "~/OnTheMoveWebFiles/js/OnTheMove_DatabaseManager.js" [7]: "~/OnTheMoveWebFiles/js/OnTheMove.js" [8]: "~/OnTheMoveWebFiles/js/OnTheMove_Offline.js" [9]: "~/OnTheMoveWebFiles/js/OnTheMove_DatabaseLoader.js" [10]: "~/OnTheMoveWebFiles/js/OnTheMove_DatabaseTestHelper.js" [11]: "~/OnTheMoveWebFiles/js/OnTheMove_SmartScriptPlayer.js" [12]: "~/OnTheMoveWebFiles/js/jasmine.js" [13]: "~/OnTheMoveWebFiles/js/jasmine-html.js" [14]: "~/OnTheMoveWebFiles/js/jasmine-jquery-1.7.0.js" [15]: "~/OnTheMoveWebFiles/js/jasmine-OnTheMove-GenericMocksAndHelpers.js" [16]: "~/OnTheMoveWebFiles/js/jasmine-OnTheMove-DatabaseManager-SiebelToSQL-Tests.js" [17]: "~/OnTheMoveWebFiles/js/jasmine-OnTheMove-TreeValidator-Tests.js" [18]: "~/OnTheMoveWebFiles/js/jasmine-OnTheMove-GlobalFunction-Tests.js" [19]: "~/OnTheMoveWebFiles/js/jasmine-OnTheMove-OnTheMove_BusinessComponent-Tests.js" [20]: "~/OnTheMoveWebFiles/js/jasmine-OnTheMove_DatabaseTestHelper-Tests.js" [21]: "~/OnTheMoveWebFiles/js/jasmine-OnTheMove_OfflineAuditing-Tests.js" [22]: "~/OnTheMoveWebFiles/js/jasmine-OnTheMove-JQueryExtension-Tests.js" 

这表明订单正在保存,但是当我在运行中缩小它时( var contents =BundleManager.GetBundleContents("~/OnTheMoveWebFiles/bundles/Testing"); )我得到了

 "function TheApplication(){return window.onTheMove.theApplication}function decodeQueryString(n,t,i,r){var f,u={},s,h,e,o;if(i||(i=function(){return}),... 

这是OnTheMove_TheApplication.js开头,而不是我期待的jquery-1.7.1.js 。 我看到的一个解决方案是将它拆分成更多的包并尝试以这种方式处理它。
为什么minifier不保留秩序? 我的期望是错的吗?

我通过创建扩展来解决此问题:

 public class AsIsBundleOrderer : IBundleOrderer { public virtual IEnumerable OrderFiles(BundleContext context, IEnumerable files) { return files; } } internal static class BundleExtensions { public static Bundle ForceOrdered(this Bundle sb) { sb.Orderer = new AsIsBundleOrderer(); return sb; } } 

然后,您可以注册您的包

 bundles.Add(new ScriptBundle("~/bundles/home") .Include("~/Scripts/leaflet-0.6.4.js") .Include("~/Scripts/oms.js") .Include("~/Scripts/home.js").ForceOrdered() );