MVC4贝塔缩小和捆绑:订购浏览器

问题描述:

我使用捆绑开始,包括在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

要暂时获得非缩小的输出使用该

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

我昨天碰到了同样的问题,找不到新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

也可以看看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

我使用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