7

Ich versuche ASP.Nets BundleTable zu verwenden, um einige Javascript-Dateien zu optomieren, aber habe ein Problem festgestellt, bei dem ein spezifisches Addon (jQuery-Timepicker) nicht funktioniert, wenn der Code minimiert wurde. Siehe here.Überspringen einer einzelnen Datei von Minimieren?

Bundle-Code ist derzeit ähnlich wie:

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

Wenn ich die jquery-ui-timepicker-addon.js Datei zu entfernen, dann schließen sie in meiner Webseite trennen, dann richtig funktioniert. (Ansonsten bekomme ich den Uncaught TypeError: undefined is not a function Fehler).

Ich frage mich, ob ich irgendwie meinen Bundling-Code einrichten kann, um zu vermeiden, diese eine Datei zu verkleinern (aber immer noch im Paket enthalten)? Ich habe mich umgesehen, aber keine Lösungen dafür gefunden.

+0

Können Sie nicht einfach die Zeile 'commonBundle.Include' für den Zeitzähler nach der Transformation verschieben? – Toby

Antwort

2

So ist das Problem, dass alle Dateien gebündelt sind, und dann das gesamte Bündel minimiert ist. Als Ergebnis werden Sie die Minimierung von nur einer Datei nicht einfach überspringen können. Der beste Weg, dies zu tun, wäre, eine neue Transformation zu erstellen, die den Inhalt dieser Datei, die Sie nicht löschen möchten, angehängt hat. Dann würde anhängen Sie dies Ihren registrierten Scriptbundle-Transformation:

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

AppendFileTransform würde einfach hängen Sie den Inhalt der Datei auf die gebündelte Antwort. Sie würden den Zeitpicker nicht mehr explizit in das Bundle einschließen, stattdessen würde diese Transformation ihn enthalten, und dies würde Ihnen effektiv das Verhalten geben, das Sie suchen, da die JsMinify-Transformation zuerst ausgeführt und das Bundle verkleinert würde, und dann würden Sie das hinzufügen Datei, die Sie am Ende unminifiziert haben wollen.

+0

Ja, Sie haben Recht, aber das Bundle wird nicht neu erstellt, wenn die Datei geändert wird. In diesem Fall vielleicht akzeptabel, aber wie allgemeine Lösung nicht. – Nenad

+0

Irgendein Hinweis auf AppendFileTransform-Code? – Spikolynn

1

Sie können Bundle nicht einrichten, um das Minimieren bestimmter Dateien zu überspringen und den Rest der Dateien zu minimieren.

Sie könnten Ihre eigenen implementieren Bundle oder Transform durch Bundle.ApplyTransform oder JsMinify.Process Methoden überschreiben, aber Sie müssten darauf achten, nicht Änderungsverfolgung von Dateien, Schlüsselerzeugung, Cache-Annullierungs zu brechen, etc ... (oder etwas hässlich zu tun hacken). Es ist die Mühe nicht wert.

Ich würde separate js Datei halten, wie Sie bereits erwähnt.

2

Dies kann besser aus der anderen Richtung gelöst werden - anstatt zu versuchen, eine einzelne Datei nicht zu verkleinern, fügen Sie stattdessen Transformationen für einzelne Elemente hinzu.

Erste - eine Klasse erstellen, die IItemTransform und verwendet den gleichen Code implementiert die Eingabe minify:

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

Second - fügen Sie diesen Artikel zu den einzelnen Dateien umwandeln und entfernen Sie das Bündel verwandeln:

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