Подтвердить что ты не робот

MVC4 Beta Minification and Bundling: заказ файлов и отладка в браузере

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

EDIT: Чтобы быть ясным, я знаю, что могу создавать пучки и регистрировать их на С#, просто кажется, что это уродливо, чтобы сделать это таким образом.

4b9b3361

Ответ 1

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

  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");

Ответ 2

Я использую MVC default NoTransform вместо NotMinifyingJavascript, предложенный chrisortman. Насколько я знаю, он делает то же самое. Но все же не оптимальный. В идеале я хочу тег script для каждого индивидуального файла script, когда я хочу отлаживать. Это упрощает отладку с VS11, который мне нравится использовать (один отладчик, поэтому я могу отлаживать js и С# в одном сеансе отладки). Поэтому я создал этот маленький помощник:

@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, если вы его установили!

Ответ 3

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

Ответ 4

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

Затем вы можете включить/отключить материал оптимизации, комментируя appsetting в web.config:

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