Пакет, що не включає .min файли


261

У мене дивна проблема з пакетом 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'?


Я використовую пакувач MVC 4, і він включає файли .min.js.
Ерік Дж.

версія RTM чи RC? він працював нормально і в РК для мене теж
фатальний

10
Ідея полягає в тому, що, працюючи в режимі налагодження, використовуватимуться версії "dev" без мінімізації, і коли ви перебуваєте в режимі не налагодження, вибирається мінімізована версія. Щоб побачити це в дії, змініть значення налагодження web.config з true на false.
Пітер Гермішуйс

28
в деяких випадках у вас немає неміфікованої версії сценарію. Я міг би зрозуміти це, якби існували обидва файли.
Фатальна

1
Це непомітний варіант, що він працює за замовчуванням як такий ... звичайно, файл може вже бути мінімізованим , але я думаю, що Microsoft не побачила переваги додавання заздалегідь скомпонованих скриптів до пакетів для кеш-пам'яті (хороший маленький vхеш параметрів що додається до URL-адреси та змінюється при зміні вмісту файлу)
нічогонеобхідного

Відповіді:


257

Я спочатку розмістив рішення, яке викликає сумніви (це брудна хакерська робота). Як зазначило багато коментаторів, в 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's bundles.DirectoryFilter in Microsoft.AspNet.Web.Optimization.1.1.3 and not bundles.IgnoreList

        //...your code
     }

4
Дякую і мені - тому додаю це до мого списку отриманих MVC4 :)
Dan B

27
це був довгий момент WTF, вони могли додати ті міні-файли, коментовані з причиною чи чимось результатом, а тепер цілу годину марно цікавився, хто краде мої файли сценаріїв з виводу.
Гедріус

5
Відповідно до коментаря Fatal в ОП, це рішення призведе до оновлення дублікатів посилань як для мінімізованої, так і для звичайної версій, якщо вони існують (наприклад, jquery).
danmiser

11
M $, коли деякий файл file.min.js чітко вказаний, або коли існує лише файл .min.js, включайте лише файл .min.js! Інакше просто застосуйте поточну поведінку!
Адаптабі

3
Неймовірно, що власне клас називається "IgnoreList", але він походить прямо з Object. Ні LINQ, ні ітерація. - msdn.microsoft.com/en-us/library/…
JP ten Berge

176

Microsoft має на увазі таку поведінку (і я вважаю за краще дотримуватися її у своїх проектах):

Коротка версія

  1. Ви маєте як налагоджувальну, так і мінімізовану версії сценарію у своєму проекті в одній папці:
    • script.js
    • script.min.js
  2. Ви додаєте до пакету у своєму коді лише script.js .

В результаті ви будете автоматично мати script.js включені в DEBUG режимі і script.min.js в RELEASE режимі.

довга версія

Ви також можете мати .debug.js версію. У цьому випадку файл включений до наступного пріоритету в DEBUG:

  1. script.debug.js
  2. script.js

у ЗВІТКУ:

  1. script.min.js
  2. script.js

Примітка

І, до речі, єдиною причиною наявності .min версій сценаріїв у MVC4 є той випадок, коли мінімізована версія не може бути оброблена автоматично. Наприклад, наступний код не може бути автоматично окупований:

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

У всіх інших випадках ви можете скористатися лише налагодженою версією сценарію.


6
Приємне пояснення, однак, проблема ОП полягала в тому, що деякі сценарії ( jquery.tmpl) не мають, не були, не завантажували нехвилинну версію файлу. Пакетник повністю ігнорує файли сценаріїв, якщо у нього немає
нехвилинної

Погодьтеся, приємне пояснення, але воно зовсім не відповідає на питання ОП.
Дієго

2
Коротка версія не працювала для мене. "script.js" буде включений в обидва ці типи релізу. Я перемкнув DEBUG / RELEASE і (коли я подивився на джерело) "script.js" був вибраним / наданим.
користувач981375

4
user981375, вам також потрібно встановити <collection debug = "false" /> у файлі web.config
Макс Шмельов

5
Я віддаю перевагу цій відповіді, оскільки це підхід "найкращих практик" і пояснює, як можна дотримуватися правил за замовчуванням постачальника для досягнення тієї ж мети.
James Reategui

5

Якщо у вас є лише мінімізована версія файлу, найпростішим рішенням, яке я знайшов, є скопіювати мінімізований файл, видалити .min з імені скопійованого файлу, а потім посилатися на не змінене ім’я файлу у вашому пакеті.

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

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

  2. Посилайтеся на немініфікований файл у вашому пакеті:

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

Просто тому, що файл без "min" в імені насправді впорядкований не повинен викликати жодних проблем (крім того, що він по суті не читається). Він використовується лише в режимі налагодження і виписується як окремий сценарій. Якщо він не знаходиться в режимі налагодження, попередньо складений min-файл повинен бути включений у ваш пакет.


4

Я знайшов хороше рішення, яке працює принаймні в MVC5, його можна просто використовувати Bundleзамість ScriptBundle. У ньому немає розумної поведінки, ScriptBundleяку нам не подобається (ігнорування .min тощо) у цьому випадку. У своєму рішенні я використовую Bundleдля 3D-скриптів учасників файли .min та .map, а також використовую ScriptBundleнаш код. Я не помітив жодних недоліків цього. Щоб зробити це таким чином, вам потрібно буде додати оригінальний файл, наприклад, angular.js, і він завантажить angular.js в налагодження, і він буде зв'язувати angular.min.js у режимі випуску.


Схоже, це не працює, коли оптимізація вимкнена ( ScriptTable.EnableOptimizations = false). Шляхи сценаріїв, що містять шаблон, не відображаються (наприклад ~/Scripts/thirdpartylib/*.js). Це робить роботу , коли EnableOptimizations = true, але точно так само ScriptBundle.
Стівен Лікенс

Я також використовую його з помилковим (під час розробки), і у мене немає проблем, які ви описуєте, тому це може впливати на це щось інше. Вам також потрібно зробити IncludeDirectory замість включення для роботи шаблону.
Ілля Чорномордик

Ви впевнені, що він відображає ".min.js" версію вашого файлу? Ви використовуєте пакети з простору імен System.Web.Optimizationsабо з пакету nuget Microsoft.Web.Optimizations?
Стівен Лійкенс

Я використовую System.Web.Optimization, і я перевірив, що вона відображає min-версію, але я зрозумів, що я не використовую IncludeDirectory насправді, але це було б дивно, якби це не працювало з min версією, хоча ... Так як IncludeDirectory не Для мене достатньо зробити сканування на замовлення і додати весь фільтр за допомогою Включити, так що може бути так, що візерунок і IncludeDirectory там не працюють належним чином, хоча це трохи дивно.
Ілля Чорномордик

1
Ні, проблема двояка: .min.jsіснує лише файл, і *.jsшаблон не відповідає файлам, що закінчуються .min.js.
Стівен Лікенс

3

Щоб відобразити *.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 UI для 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.*"));

Я зіткнувся з деякими відсутніми сценаріями в постановці публікації, і, думаючи, що це проблема MVC, я знайшов цю відповідь. Працюючи з цим занадто довго, я роблю все, щоб піти від кендо
Феліпе

@Felipe Я опинився в тій же ситуації, через що я написав цю відповідь. Кендо жахливий. Сподіваюся, мій приклад корисний.
Стівен Лікенс

2

У моєму випадку я використовував (чудову!) Бібліотеку Knockout.js, яка надходить як Debug / Non версії:

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

Щоб зробити цю роботу, я включив "Knockout- {Version} .js" (без налагодження) у своєму пакеті та отримав .debug. файл js в режимі налагодження.


1

Простий спосіб просто перейменувати .min-файл, наприклад, у вас є abc.min.css, ніж просто перейменувати цей файл на abc_min.css і додати це у свій пакет. Я знаю, що це не правильний спосіб зробити це, а просто тимчасове рішення. спасибі та щасливе кодування.


1
Кожен раз, коли завантажуєте файл із цілістю, потрібно перейменувати його.
Анірудха Гупта

Я знаю, що це не правильний спосіб зробити це, але просто тимчасове рішення
RK Sharma

1
поставити цей рядок для мене працює // BundleTable.EnableOptimizations = true;
Анірудха Гупта

0

Покупця має багато переваг, перевірте цю сторінку, АЛЕ :

Платформа Microsoft MVC4 вважає, що у вас є принаймні і мінімізована версія, і немініфікована версія для кожного пакета сценаріїв або стилів (також доступні інші файли, такі як Debug і vsdoc). Тож ми маємо проблеми в ситуаціях, коли є лише один із цих файлів.

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

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

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


1
Додавання налагодження = "false" все ще не працює для мене. Файли min.js як і раніше не включаються, хоча я також очищую IgnoreList ...
MoSs

-21

Люди, я б просто тримати його просто, поки 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")   
 }

Таким чином ми отримуємо найкращі пакети у виробництві та довідку у налагодженні

Виправте це, коли Microsoft виправить свій код MVC 4


3
Я взагалі не прихильник цього запропонованого рішення. Тепер вам доведеться підтримувати набір сценаріїв (принаймні) у двох місцях
Fatal

Це, в значній мірі, перемагає мету комплектування, ви не думаєте?
Олівер

4
Пакет вже працює таким чином. Якщо ви запускаєте проект у режимі налагодження, кожен CSS-файл завантажується індивідуально, однак при запуску у випуску вони поєднуються та мінімізуються в один. Код в блоці if ідентичний тому, що відображається на сторінці автоматично в режимі налагодження.
Чад Леві
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.