2012-03-11 74 views
14

我使用捆綁開始,包括在MVC4貝塔縮小文件和調試。我遇到了幾個問題:MVC4貝塔縮小和捆綁:訂購瀏覽器

首先,如果我使用經典的<script src="Folder/js" type="text/javascript"/>捆綁,似乎我必須重命名我的文件以確保它們按照正確的順序捆綁在一起。

  • 比方說,我有三個JavaScript文件: 「ants.js」, 「bugs.js」, 「insects.js」
  • ants.js取決於bugs.js
  • bugs.js取決於insects.js
  • 默認捆綁似乎捆綁他們按字母順序排列。
  • 爲了讓它們正確綁定,我必須將它們重命名爲:「0.insects.js」,「1.bugs.js」,「2.ants.js」
  • 這真的很駭人,做一個更清潔的方式。

我有下一個問題是調試。我喜歡在我的測試瀏覽器中瀏覽javascript,有沒有辦法在DEBUG模式下關閉縮小?

編輯:要清楚,我知道我可以創建束和從C#進行註冊,它只是似乎真的很醜不得不這樣做的。

+0

相關問題 - http://stackoverflow.com/questions/9373071/how-to-disable-javascript-css-minification-in-asp-net-mvc-4 – resnyanskiy 2012-03-21 08:30:14

回答

11

要暫時獲得非縮小的輸出使用該

public class NonMinifyingJavascript : IBundleTransform 
{ 
    public void Process(BundleContext context, BundleResponse bundle) 
    { 
     if(bundle == null) 
     { 
      throw new ArgumentNullException("bundle"); 
     } 

     context.HttpContext.Response.Cache.SetLastModifiedFromFileDependencies(); 

     foreach(FileInfo file in bundle.Files) 
     { 
      HttpContext.Current.Response.AddFileDependency(file.FullName); 
     } 

     bundle.ContentType = "text/javascript"; 
     //base.Process(context, bundle); 
    } 
} 

如果你想讓它完全基於對配置設置,我想你可以創建一個IBundle變換一個或JsMinify取決於你的配置代表本設置

爲了控制你需要使用BundleFileSetOrdering

var javascriptBundle = new Bundle("~/site/js", new NonMinifyingJavascript()); 

     //controls ordering for javascript files, otherwise they are processed in order of AddFile calls 
     var bootstrapOrdering = new BundleFileSetOrdering("bootstrap"); 
     //The popover plugin requires the tooltip plugin 
     bootstrapOrdering.Files.Add("bootstrap-tooltip.js"); 
     bootstrapOrdering.Files.Add("bootstrap-popover.js"); 
     BundleTable.Bundles.FileSetOrderList.Add(bootstrapOrdering); 
     javascriptBundle.AddDirectory("~/Scripts", "bootstrap-*.js"); 
+0

這正是我需要它做的事情,它吸收它不能做得更無暇,但我會採取我能得到的。 – 2012-03-13 02:38:48

1

我昨天碰到了同樣的問題,找不到新System.Web.Optimization命名空間的一個很好的解決方案。有一些破碎的MSDN鏈接,這樣的事實,一切都處於測試階段,意味着它可能會改變,但我離題...

你總是可以在開發過程中不同加載腳本比在生產。容易做到的AppSetting:

@if (System.Configuration. 
    ConfigurationManager.AppSettings["BundleResources"] != null) 
{ 
    @* load the css & js using bundles *@ 
} 
else 
{ 
    @* load the css & js files individually*@ 
} 

然後,您可以啓用/在web.config中註釋掉的appsetting禁用優化的東西:

<appSettings> 
    ... 
    <!--<add key="BundleResources" value="uhuh" />--> 
    ... 
</appSettings> 
+0

Yeesh,這是次優。看起來他們只是提供了功能,而且他們自己還沒有使用它。我無法想象它長久保持這種狀態。 – 2012-03-11 18:26:14

+0

有意無意地,我正在用類似於'@ {#if DEBUG}'的編譯器指令來做類似這樣的事情,它看起來很醜。 – 2012-03-11 18:28:23

+0

大聲笑,是啊我已經看到他們已經改變了API的一些地方(新的JsMinify()而不是typeof(JsMinify))。我無法想象它會長期保持這種狀態。如果捆綁/縮小很重要,也可能想要像Matt公佈的那樣查看RequestReduce。 – danludwig 2012-03-11 18:43:53

2

也可以看看RequestReduce。它將您的腳本和CSS捆綁在一起,無需任何編碼或配置,只需查看它們如何佈置在您的頁面上並根據此進行捆綁即可。它還允許您通過web.config或通過查詢字符串參數RRFilter=disabled個別請求turn off bundling and minification

+1

這真的很有趣,我最終可能會使用類似的東西。不過,部分我真的想堅持使用MVC 4打包的內容。 – 2012-03-11 18:48:18

+1

如果有任何安慰,這是什麼在MSDN/Technet屬性上使用,包括MSDN博客的捆綁/縮小。 – 2012-03-11 18:54:33

+0

哈哈..我很高興你明白我需要安慰......因爲我做到了。我對這個新的wiz-bang功能感到失望。 – 2012-03-11 19:51:17

7

我使用MVC的JavaScript文件的順序默認NoTransform而不是由chrisortman提出的NonMinifyingJavascript。據我所知它也是一樣。 但仍不是最佳。理想情況下,我希望在調試時爲每個個人腳本文件提供一個腳本標記。這使得我使用VS11進行調試變得更容易(一個調試器,因此我可以在一個調試會話中調試js和c#)。 所以我創造了這個小幫手:

@helper RenderScriptTags(string virtualPath) 
{ 
    if (Minify /* some appsetting */) 
    { 
     <script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(virtualPath)"></script> 
    } 
    else 
    { 
     foreach (var file in System.Web.Optimization.BundleResolver.Current.GetBundleContents(virtualPath)) 
     { 
      <script src="@Url.Content(file)"></script> 
     } 
    } 
} 

@RenderScriptTags("~/libraries") 

我有一個單頁的應用程序,所以我有這個在我的主要CSHTML文件,但它可以很容易地通過這個移動到的HtmlHelper擴展方法一概而論。 工程很好!

這段代碼也考慮到了BundleFileSetOrdering,如果你設置了一個!

+0

不錯的一個! :)非常有用! – MojoDK 2012-06-06 09:56:24