Asp.net-Mvc

如何指定明確的 ScriptBundle 包含順序?

  • August 16, 2012

我正在嘗試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); 

然後在預設索引頁面中,我添加了:

&lt;script src="@Scripts.Url("~/bundles/scripts/canvas")"&gt;&lt;/script&gt;

我驗證了在壓縮包的 javascript 中,results.js 的內容是在modernizr 之後……

您可以編寫一個自定義捆綁訂購程序 ( IBundleOrderer),以確保捆綁包含在您註冊它們的順序中:

public class AsIsBundleOrderer : IBundleOrderer
{
   public virtual IEnumerable&lt;FileInfo&gt; OrderFiles(BundleContext context, IEnumerable&lt;FileInfo&gt; 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")

引用自:https://stackoverflow.com/questions/11979718