MVC4 Beta Minification and Bundling: заказ файлов и отладка в браузере - PullRequest
14 голосов
/ 11 марта 2012

Я начал использовать связывание и минификацию, включенную в бета-версию 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 в моих тестовых браузерах, есть ли способ отключить только минификацию в режиме отладки?

РЕДАКТИРОВАТЬ: Чтобы было ясно, я знаю, что могу создавать пакеты и регистрировать их из C #просто кажется действительно уродливым делать это таким образом.

Ответы [ 4 ]

11 голосов
/ 12 марта 2012

Чтобы временно получить неминифицированный вывод, используйте это

  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 в зависимости от настроек конфигурации

Для управления порядком файлов javascript вам необходимо использовать 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");
7 голосов
/ 14 марта 2012

Я использую NoTransform по умолчанию MVC вместо NonMinifyingJavascript, предложенного chrisortman.Насколько я знаю, он делает то же самое.Но все же не оптимально.В идеале я хочу тег сценария для каждого отдельного файла сценария, когда я хочу отладить.Это делает отладку намного проще с 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, если вы его установили!

2 голосов
/ 11 марта 2012

Можно также взглянуть на RequestReduce . Он связывает ваши скрипты и CSS без какого-либо кодирования или конфигурации, глядя на то, как они размещены на вашей странице, и в соответствии с этим. Это также позволяет вам отключить связывание и минимизацию через web.config или для индивидуальных запросов через параметр строки запроса: RRFilter=disabled.

1 голос
/ 11 марта 2012

Вчера я столкнулся с той же проблемой и не смог найти хорошего решения с новым пространством имен 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:

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