7

Próbuję użyć pakietu ASP.Nets BundleTable, aby optomize niektóre pliki javascript, ale wystąpił problem, w którym określonego dodatku (jQuery-Timepicker) nie działa, gdy kod został minified. Zobacz here.Pomiń pojedynczy plik z Minifying?

Code Bundle jest obecnie podobna do:

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

Jeśli usunąć plik jquery-ui-timepicker-addon.js, a następnie umieścić go rozdzielić na mojej stronie, to działa poprawnie. (W przeciwnym razie pojawi się błąd Uncaught TypeError: undefined is not a function).

Zastanawiam się, czy mogę w jakiś sposób skonfigurować mój kod dołączania, aby pominąć minimalizowanie tego jednego pliku (ale nadal ma go w pakiecie)? Rozglądałem się, ale nie znalazłem żadnych rozwiązań.

+0

Nie możesz po prostu przenieść linii 'commonBundle.Include' dla timepicker'a po transformacji? – Toby

Odpowiedz

2

Problem polega na tym, że wszystkie pliki są ze sobą połączone, a następnie cały pakiet jest zminimalizowany. W rezultacie nie będzie można łatwo pominąć zminimalizowania tylko jednego pliku. Prawdopodobnie najlepszym sposobem na to byłoby stworzenie nowej transformacji, która dołącza zawartość tego pliku, który chcesz unminified. Wtedy można dołączyć to Transform do zarejestrowanej ScriptBundle:

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

AppendFileTransform po prostu dołączyć zawartość pliku w pakiecie odpowiedzi. Nie będzie już jawnie dołączał timepicker w pakiecie, ale zamiast tego przekształcenie to będzie zawierało go, a to faktycznie da ci zachowanie, którego szukasz, ponieważ transformacja JsMinify zostanie uruchomiona jako pierwsza i zminimalizuje pakiet, a następnie dodasz plik, który chcesz na końcu unminified.

+0

Tak, masz rację, ale nie odtworzy pakietu, jeśli plik zostanie zmodyfikowany. W tym przypadku może być do zaakceptowania, ale jak ogólne rozwiązanie nie. – Nenad

+0

Jakieś wskazówki dotyczące kodu AppendFileTransform? – Spikolynn

1

Nie można skonfigurować pakietu, aby pominąć minimalizowanie niektórych plików i minimalizować pozostałe pliki.

Można zaimplementować własną Bundle lub Transform nadrzędnymi Bundle.ApplyTransform lub JsMinify.Process metody, ale trzeba uważać, aby nie złamać zmiana śledzenie plików, generowania klucza, cache unieważnianie, etc ... (czyli jakiś brzydki włamać się). To nie jest warte wysiłku.

Chciałbym zachować oddzielny plik js, jak już wspomniano.

2

Można to lepiej rozwiązać z drugiej strony - zamiast próbować minimalizować pojedynczy plik, należy zamiast tego dodawać przekształcenia dla poszczególnych elementów.

- najpierw utworzyć klasę, która implementuje IItemTransform i wykorzystuje ten sam kod do minify danego wejścia:

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; 
    } 
} 

drugie - dodać ten przedmiot przekształcić do poszczególnych plików i usunąć wiązkę transform:

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); 
Powiązane problemy