Ich baue ein ASP.NET MVC4-basiertes jQuery-Plug-in und möchte den Standard Microsoft Bundler .
Nun, normalerweise, wenn ich den Bundler benutze, ist dies die letzte Verwendung:
%Vor%Mit einer solchen Ausgabe in debug:
%Vor%Und ein einzelnes Tag für die verkleinerte und kombinierte Datei in der offiziellen Version.
Da wir jedoch ein jQuery-Plug-in erstellen, möchte ich den Minifier verwenden, um das tatsächliche JavaScript aus den verschiedenen Dateien einzufügen, zB in DEBUG, wenn ich Object1
in einer Datei definiert und Object2
in einer anderen definiert habe dann bekomme ich das:
und in der Version würde ich den minimierten Inhalt bekommen.
Von der MSDN Ich habe gesehen, dass der Bundler das standardmäßig nicht kann. Aber ich frage mich, gibt es eine Erweiterung, die dies oder eine andere Minifing-Bibliothek tun kann? Obwohl ich lieber mit dem Microsoft Bundler bleiben würde.
In meiner eigenen Studie zur Erweiterung des System.Web.Optimizer habe ich das Projekt CodePlex gefunden von System.Web.Optimization
, wo gesagt wird, dass es noch nicht Open Source ist, macht das Ausstrecken irgendwie schwierig für irgendjemanden, der nicht wirklich daran arbeitet.
EDIT: Da ich weiß, dass ich den System.Web.Optimizer nicht wirklich erweitern kann, ging ich mit einer Kompromisslösung und das ist es, was ich am Ende benutzt habe.
Im Controller:
%Vor%Und in der Ansicht ( jQueryComponent.cshtml ):
%Vor% Irgendwelche Ideen, wie man dies verbessern kann, sind willkommen neben der richtigen Erweiterung des Bündlers.
Obwohl das funktioniert, ist das alles andere als ideal und ich bin mir dessen bewusst
Bitte kritisieren Sie diesen Ansatz nicht, es sei denn, Sie haben eine Alternative.
Sie können tun, was der BundleHandler tut: Holen Sie sich ein Bundle basierend auf dem virtuellen Pfad (den Sie auch verwenden würden)
@Script.Render
), generieren Sie die Antwort und schreiben Sie das < a href="http://msdn.microsoft.com/en-us/library/system.web.optimization.bundlerresponse.content.aspx"> Inhalt .
Oder kurz:
%Vor%BEARBEITEN: Um uneminifizierten Inhalt im Debug zu erhalten, können wir tun was Skripte macht : Holen Sie das Bundle erneut, aber anstatt die Antwort zu generieren, iterieren Sie die Dateien und schreiben Sie deren Inhalt ( abgegrenzt ).
%Vor%Es ist einfacher, dafür eine eigene Klasse und einen stabilen Minifier zu erstellen.
Was den Minifier betrifft, können Sie einen der folgenden verwenden:
Ihre benutzerdefinierte Klasse sollte:
List<string>
, um die Dateien in jedem Bündel zu speichern Dictionary<string,List<string>>
mit einem Paketnamen string
und eine Liste mit Dateinamen List<string>
. Um die nichtminimierte Version zu erstellen, müssen Sie einfach alle Dateien in einer Zeichenfolge mit einer der dafür verfügbaren Klassen lesen (für Beispiel StringBuilder
, StringWriter
, StreamReader
, File
). Wenn Sie die Platzhalternamen im Bundler nachahmen müssen, verwenden Sie Directory
und vielleicht Regex
classes.
Das Ergebnis des Lesens sollte in einem statischen Wörterbuch gespeichert werden, das den Namen des Bündels und den Inhalt des Pakets enthält (zum Zwischenspeichern und Vermeiden des wiederholten Lesens der gleichen Dateien).
Schließlich müssen Sie es minimieren.
Sie können die Minificacion abhängig von zwei verschiedenen Dingen umschalten:
#ifdef DEBUG
... #endif
, die von der im Konfigurationsmanager gewählten Lösungskonfiguration abhängt: debug / release Minimierung mit YUI-Kompressor:
%Vor%Minimieren mit MS Ajax Minifier:
%Vor%Sie sollten die verkleinerten Versionen auch in einem statischen Wörterbuch speichern, um sie auch zwischenzuspeichern.
Dies ist ein grundlegendes Arbeitsprobe:
%Vor%Tags und Links c# asp.net asp.net-mvc-4 bundle