Bundler не включает файлы .min

У меня есть странная проблема с пакетом mvc4, не включающим файлы с расширением .min.js

В моем классе BundleConfig я объявляю

public static void RegisterBundles(BundleCollection bundles)
{
    bundles.Add(new ScriptBundle("~/Scripts/jquery")
        .Include("~/Scripts/jquery-1.8.0.js")
        .Include("~/Scripts/jquery.tmpl.min.js"));            
}

На мой взгляд, я объявляю

<html>
    <head>
    @Scripts.Render("~/Scripts/jquery")
    </head><body>test</body>
</html>

И когда он отображает, он отображает только

<html>
    <head>
         <script src="/Scripts/jquery-1.8.0.js"></script>
    </head>
    <body>test</body>
</html>

Если я переименую jquery.tmpl.min.js в jquery.tmpl.js(и соответственно обновить путь в комплекте), оба сценария отображаются правильно.

Есть ли какой-либо параметр конфигурации, который заставляет его игнорировать файлы .min.js?

Ответ 1

Решение, которое я изначально опубликовано, вызывает сомнения (это грязный хак). Измененное поведение изменилось в пакете Microsoft.AspNet.Web.Optimization, и настройка больше не работает, о чем свидетельствуют многие комментаторы. Сейчас я не могу воспроизвести проблему вообще с версией 1.1.3 пакета.

Пожалуйста, смотрите источники System.Web.Optimization.BundleCollection(например, вы можете использовать dotPeek), чтобы лучше понять, что вы думаете делать. Также прочитайте Ответ Максима Шмелева.

Оригинальный ответ:

Переименуйте .min.js в .js или выполните что-то вроде

    public static void AddDefaultIgnorePatterns(IgnoreList ignoreList)
    {
        if (ignoreList == null)
            throw new ArgumentNullException("ignoreList");
        ignoreList.Ignore("*.intellisense.js");
        ignoreList.Ignore("*-vsdoc.js");
        ignoreList.Ignore("*.debug.js", OptimizationMode.WhenEnabled);
        //ignoreList.Ignore("*.min.js", OptimizationMode.WhenDisabled);
        ignoreList.Ignore("*.min.css", OptimizationMode.WhenDisabled);
    }

    public static void RegisterBundles(BundleCollection bundles)
    {
        bundles.IgnoreList.Clear();
        AddDefaultIgnorePatterns(bundles.IgnoreList);
        //NOTE: it bundles.DirectoryFilter in Microsoft.AspNet.Web.Optimization.1.1.3 and not bundles.IgnoreList

        //...your code
     }

Ответ 2

Microsoft подразумевает следующее поведение (и я предпочитаю следовать ему в моих проектах):

короткая версия

  • У вас есть как отладочные, так и уменьшенные версии script в вашем проекте в той же папке:
    • script.js
    • script.min.js
  • Вы добавляете в свой код только script.js.

В результате у вас автоматически есть script.js, включенных в режим DEBUG, и script.min.js в режиме RELEASE.

длинная версия

У вас также может быть версия .debug.js. В этом случае файл включается в следующий приоритет в DEBUG:

  • script.debug.js
  • script.js

в RELEASE:

  • script.min.js
  • script.js

Примечание

И, кстати, единственная причина наличия .min версий ваших скриптов в MVC4 - это случай, когда мини-версию нельзя обрабатывать автоматически. Например, следующий код не может быть запутан автоматически:

if (DEBUG) console.log("Debug message");

Во всех остальных случаях вы можете использовать только отладочную версию вашего script.

Ответ 3

Если у вас есть мини-версия файла, самое простое решение, которое я нашел, это скопировать мини файл, удалить .min из скопированного имени файла, а затем ссылаться на неминифицированное имя файла в вашем пакете.

Например, скажем, вы купили компонент js, и они дали вам файл с именем some-lib-3.2.1.min.js. Чтобы использовать этот файл в пакете, выполните следующие действия:

  • Скопируйте файл some-lib-3.2.1.min.js и переименуйте скопированный файл в файл some-lib-3.2.1.js. Включите оба файла в свой проект.

  • Ссылка на неминифицированный файл в вашем комплекте, например:

    bundles.Add(new ScriptBundle("~/bundles/libraries").Include(
        "~/Scripts/some-lib-{version}.js"
    ));
    

Просто потому, что файл без 'min' в имени фактически минимизирован, не должен вызывать никаких проблем (кроме того, что он практически нечитабелен). Он используется только в режиме отладки и записывается как отдельный script. Если не в режиме отладки, в ваш пакет должен быть включен предварительно скомпилированный файл min.

Ответ 4

Я нашел хорошее решение, которое работает хотя бы в MVC5, вы можете просто использовать Bundle вместо ScriptBundle. У этого нет умного поведения ScriptBundle, который нам не нравится (игнорируя .min и т.д.) В этом случае. В моем решении я использую Bundle для трехсторонних скриптов с файлами .min и .map, и я использую ScriptBundle для нашего кода. Я не заметил никаких недостатков этого. Чтобы заставить его работать таким образом, вам нужно будет добавить оригинальный файл, например. angular.js, и он будет загружать angular.js в debug, и он будет связывать angular.min.js в режиме выпуска.

Ответ 5

Чтобы отобразить файлы *.min.js, вы должны отключить BundleTable.EnableOptimizations, который является глобальным параметром, который применяется ко всем связям.

Если вы хотите включить оптимизацию только для определенных пакетов, вы можете создать свой собственный тип ScriptBundle, который временно включает оптимизацию при перечислении файлов в комплекте.

public class OptimizedScriptBundle : ScriptBundle
{
    public OptimizedScriptBundle(string virtualPath)
        : base(virtualPath)
    {
    }

    public OptimizedScriptBundle(string virtualPath, string cdnPath)
        : base(virtualPath, cdnPath)
    {
    }

    public override IEnumerable<BundleFile> EnumerateFiles(BundleContext context)
    {
        if (context.EnableOptimizations)
            return base.EnumerateFiles(context);
        try
        {
            context.EnableOptimizations = true;
            return base.EnumerateFiles(context);
        }
        finally
        {
            context.EnableOptimizations = false;
        }
    }
}

Используйте OptimizedScriptBundle вместо ScriptBundle для пакетов, чей минитипированный файл всегда должен использоваться, независимо от того, существует ли файл с минимальными значениями.

Пример для пользовательского интерфейса Kendo для ASP.NET MVC, который распространяется как набор только мини файлов.

bundles.Add(new OptimizedScriptBundle("~/bundles/kendo")
        .Include(
            "~/Scripts/kendo/kendo.all.*",
            "~/Scripts/kendo/kendo.aspnetmvc.*",
            "~/Scripts/kendo/cultures/kendo.*",
            "~/Scripts/kendo/messages/kendo.*"));

Ответ 6

В моем случае я использовал (замечательную!) библиотеку Knockout.js, которая поставляется как Debug/Non versions:

"~/Scripts/knockout-{Version}.js"
"~/Scripts/knockout-{Version}.Debug.js"

Чтобы сделать эту работу, я включил "Knockout- {Version}.js" (не отлаживаемый) в свой Bundle и получил .debug. js в режиме отладки.

Ответ 7

Простым способом просто переименуйте файл .min, например, у вас есть abc.min.css, а не просто переименуйте этот файл в abc_min.css и добавьте его в свой комплект. Я знаю, что это не правильный способ сделать это, а просто временное решение. благодарность и счастливое кодирование.

Ответ 8

У Bundler есть много преимуществ проверить эту страницу НО:

Платформа Microsoft MVC4 Полагает, что у вас есть как минимум, так и неминифицированная версия для каждого Script или Style Bundle (также доступны другие файлы, такие как Debug и vsdoc). Поэтому у нас есть проблемы в ситуациях, когда есть только один из этих файлов.

Вы можете изменить состояние отладки в файле web.config навсегда для обработки вывода:

<compilation debug="false" targetFramework="4.0" />

Смотрите выходные изменения! Фильтрация файлов изменилась. Для достижения этой цели мы должны изменить фильтрацию фильтра игнорирования, которая изменит логику приложения!

Ответ 9

Folks Я просто оставил бы это просто, пока Microsoft не начнет действовать вместе

Попробуйте это

В RegisterBundles создайте этот комплект для Kendo

bundles.Add(new StyleBundle("~/Content/kendo/css").Include(
                    "~/Content/kendo/2012.3.1121/kendo.common.min.css",
                     "~/Content/kendo/2012.3.1121/kendo.dataviz.min.css",
                      "~/Content/kendo/2012.3.1121/kendo.blueopal.min.css"
 ));

В _Layout.cshtml поставьте это:

@if (HttpContext.Current.IsDebuggingEnabled)
 { 
<link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.common.min.css")"      
rel="stylesheet"  type="text/css" />
<link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.dataviz.min.css")" 
rel="stylesheet" type="text/css" />   
<link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.blueopal.min.css")"    
rel="stylesheet" type="text/css" />
 }
 else
 {
     @Styles.Render("~/Content/kendo/css")   
 }

Таким образом, мы получаем лучшие из пакетов в Production и ссылку в Debug

Исправить это, когда Microsoft исправляет свой код MVC 4