7

Я пытаюсь использовать ASP.Nets BundleTable, чтобы опционировать некоторые файлы javascript, но столкнулся с проблемой, когда конкретный аддон (jQuery-Timepicker) не работает, когда код был уменьшен. См. here.Пропустить одиночный файл из Minifying?

код Bundle в настоящее время аналогичен:

// Add our commonBundle 
var commonBundle= new Bundle("~/CommonJS" + culture.ToString()); 

// JQuery and related entries. 
commonBundle.Include("~/Scripts/jquery-1.7.2.js"); 
commonBundle.Include("~/Scripts/jquery-ui-1.8.22.js"); 
commonBundle.Include("~/Scripts/jquery.cookie.js"); 
commonBundle.Include("~/Scripts/jquery-ui/jquery-ui-timepicker-addon.js"); // This is the one that does not work when bundled 

// JS Transformer 
commonBundle.Transforms.Add(new JsMinify()); 

BundleTable.Bundles.Add(commonBundle); 

Если удалить файл jquery-ui-timepicker-addon.js, а затем включить его отдельно в моей веб-странице, то он работает правильно. (В противном случае я получаю ошибку Uncaught TypeError: undefined is not a function).

Мне интересно, смогу ли я каким-то образом настроить свой код связывания, чтобы пропустить минирование этого одного файла (но все же включить его в комплект)? Я смотрю вокруг, но не придумал никаких решений для этого.

+0

Не можете ли вы просто переместить строку 'commonBundle.Include' для timepicker после преобразования? – Toby

ответ

2

Итак, проблема заключается в том, что все файлы связаны вместе, а затем весь пакет минимизирован. В результате вы не сможете легко пропустить минимизацию только одного файла. Вероятно, лучшим способом сделать это было бы создание нового Transform, в котором было бы добавлено содержимое этого файла, который вы хотите unminified. Тогда вы бы добавить это преобразование к вашему зарегистрированному ScriptBundle:

commonBundle.Transforms.Add(new AppendFileTransform(""~/Scripts/jquery-ui/jquery-ui-timepicker-addon.js"")); 

AppendFileTransform просто добавить содержимое файла, входящего в комплект поставки ответ. Вы бы больше не включали timepicker в пакет, но вместо этого это преобразование будет включать его, и это эффективно даст вам поведение, которое вы ищете, поскольку преобразование JsMinify будет запускаться первым и минимизировать пакет, а затем вы добавите файл, который вы хотите в конце, не был анонимным.

+0

Да, вы правы, но это не воссоздает пакет, если файл изменен. В этом случае может быть приемлемым, но, как и общее решение, нет. – Nenad

+0

Любой намек на код AppendFileTransform? – Spikolynn

1

Вы не можете настроить Bundle, чтобы пропустить минирование определенных файлов и минимизировать остальную часть файлов.

Вы могли бы реализовать свой собственный Bundle или Transform путем переопределения Bundle.ApplyTransform или JsMinify.Process методы, но вы должны заботиться, чтобы не нарушать отслеживания изменений файлов, генерации ключей, кэш недействительности и т.д ... (или делает некоторые уродливые взломать). Это не стоит усилий.

Я бы сохранил отдельный файл js, как вы уже упоминали.

2

Это можно решить лучше с другого направления - вместо того, чтобы пытаться не минимизировать один файл, вместо этого добавьте преобразования для отдельных элементов.

Первый - создать класс, который реализует IItemTransform и использует тот же код для Минимизировать данный вход:

public class JsItemMinify : System.Web.Optimization.IItemTransform 
{ 
    public string Process(string includedVirtualPath, string input) 
    { 
     var min = new Microsoft.Ajax.Utilities.Minifier(); 
     var result = min.MinifyJavaScript(input); 
     if (min.ErrorList.Count > 0) 
      return "/*minification failed*/" + input; 

     return result; 
    } 
} 

Второй - добавить этот элемент преобразовать в отдельные файлы и удалить пакет преобразования:

var commonBundle= new Bundle("~/CommonJS"); 
// the first two includes will be minified 
commonBundle.Include("~/Scripts/jquery-1.7.2.js", new JsItemMinify()); 
commonBundle.Include("~/Scripts/jquery-ui-1.8.22.js", new JsItemMinify()); 

// this one will not 
commonBundle.Include("~/Scripts/jquery.cookie.js"); 

// Remove the default JsMinify bundle transform 
commonBundle.Transforms.Clear(); 

BundleTable.Bundles.Add(commonBundle);