如何指定明確的 ScriptBundle 包含順序?
我正在嘗試MVC4 System.Web.Optimization 1.0 ScriptBundle 功能。
我有以下配置:
public class BundleConfig { public static void RegisterBundles(BundleCollection bundles) { // shared scripts Bundle canvasScripts = new ScriptBundle(BundlePaths.CanvasScripts) .Include("~/Scripts/modernizr-*") .Include("~/Scripts/json2.js") .Include("~/Scripts/columnizer.js") .Include("~/Scripts/jquery.ui.message.min.js") .Include("~/Scripts/Shared/achievements.js") .Include("~/Scripts/Shared/canvas.js"); bundles.Add(canvasScripts); } }和以下觀點:
<script type="text/javascript" src="@Scripts.Url(BundlePaths.CanvasScripts)"></script>
BundlePaths.CanvasScripts在哪裡"~/bundles/scripts/canvas"。它呈現:<script type="text/javascript" src="/bundles/scripts/canvas?v=UTH3XqH0UXWjJzi-gtX03eU183BJNpFNg8anioG14_41"></script>到目前為止一切順利,除了
~/Scripts/Shared/achievements.js捆綁源中的第一個腳本。這取決於ScriptBundle. 如何確保它遵守我將包含語句添加到包的順序?更新
這是一個相對較新的 ASP.NET MVC 4 應用程序,但它引用了優化框架預發布包。我刪除了它並從<http://nuget.org/packages/Microsoft.AspNet.Web.Optimization>添加了 RTM 包。使用 web.config 中帶有 debug=true 的 RTM 版本,
@Scripts.Render("~/bundles/scripts/canvas")以正確的順序呈現各個腳本標籤。在 web.config 中使用 debug=false 時,組合腳本首先具有成就.js 腳本,但由於它是稍後呼叫的函式定義(對象建構子),因此它執行時不會出錯。也許縮小器足夠聰明,可以找出依賴關係?
我還嘗試了
IBundleOrdererDarin Dimitrov 建議的帶有兩個調試選項的 RTM 實現,它的行為相同。所以縮小版本不是我期望的順序,但它可以工作。
我在 RTM 位上沒有看到這種行為,您是否使用 Microsoft ASP.NET Web 優化框架 1.0.0 位: http: //nuget.org/packages/Microsoft.AspNet.Web.Optimization?
我根據一個新的 MVC4 Internet 應用程序網站使用了與您的範例類似的複製品。
我添加到 BundleConfig.RegisterBundles:
Bundle canvasScripts = new ScriptBundle("~/bundles/scripts/canvas") .Include("~/Scripts/modernizr-*") .Include("~/Scripts/Shared/achievements.js") .Include("~/Scripts/Shared/canvas.js"); bundles.Add(canvasScripts);然後在預設索引頁面中,我添加了:
<script src="@Scripts.Url("~/bundles/scripts/canvas")"></script>我驗證了在壓縮包的 javascript 中,results.js 的內容是在modernizr 之後……
您可以編寫一個自定義捆綁訂購程序 (
IBundleOrderer),以確保捆綁包含在您註冊它們的順序中:public class AsIsBundleOrderer : IBundleOrderer { public virtual IEnumerable<FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files) { return files; } }然後:
public class BundleConfig { public static void RegisterBundles(BundleCollection bundles) { var bundle = new Bundle("~/bundles/scripts/canvas"); bundle.Orderer = new AsIsBundleOrderer(); bundle .Include("~/Scripts/modernizr-*") .Include("~/Scripts/json2.js") .Include("~/Scripts/columnizer.js") .Include("~/Scripts/jquery.ui.message.min.js") .Include("~/Scripts/Shared/achievements.js") .Include("~/Scripts/Shared/canvas.js"); bundles.Add(bundle); } }在您看來:
@Scripts.Render("~/bundles/scripts/canvas")