7

Sto cercando di utilizzare il bundleTable ASP.Nets per optomize alcuni file javascript, ma ho incontrato un problema in cui un addon specifico (jQuery-Timepicker) non funziona quando il codice è stato minimizzato. Vedi here.Salta il singolo file da Minifying?

codice Bundle è attualmente simile a:

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

Se rimuovo il file jquery-ui-timepicker-addon.js, poi includerlo separare nella mia pagina web, allora funziona correttamente. (Altrimenti ottengo l'errore Uncaught TypeError: undefined is not a function).

Mi chiedo se posso in qualche modo configurare il mio codice di raggruppamento per saltare la minificazione di questo file (ma è ancora incluso nel pacchetto)? Mi sono guardato intorno ma non ho trovato nessuna soluzione per farlo.

+0

Non puoi semplicemente spostare la riga 'commonBundle.Include' per il timepicker dopo la trasformazione? – Toby

risposta

2

Quindi il problema è che tutti i file sono raggruppati insieme e quindi l'intero pacchetto è ridotto a icona. Di conseguenza, non sarà possibile saltare facilmente la limitazione di un solo file. Probabilmente il modo migliore per farlo sarebbe creare una nuova Trasformata che aggiungesse il contenuto di questo file che non vuoi più aprire. Poi si sarebbe aggiungere questa trasformazione alla ScriptBundle registrati:

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

AppendFileTransform sarebbe semplicemente aggiungere i contenuti del file alla risposta in bundle. Non includeresti più esplicitamente il timepicker nel bundle, ma questa trasformazione lo includerebbe, e questo ti darebbe effettivamente il comportamento che stai cercando dal momento che la trasformazione di JsMinify verrà eseguita prima e il bundle sarà ridotto, e quindi aggiungerei il file che vuoi alla fine non ancora terminato.

+0

Sì, hai ragione, ma non ricreare il pacchetto se il file viene modificato. In questo caso forse accettabile, ma come soluzione generale no. – Nenad

+0

Qualche suggerimento sul codice AppendFileTransform? – Spikolynn

1

Non è possibile impostare Bundle per saltare la minimizzazione di determinati file e per ridurre il resto dei file.

Si potrebbe implementare il proprio Bundle o Transform sovrascrivendo Bundle.ApplyTransform o JsMinify.Process metodi, ma si avrebbe bisogno di fare attenzione a non rompere il rilevamento delle modifiche di file, generazione di chiavi, invalidazione della cache, ecc ... (o fare qualche brutto hack). Non ne vale la pena.

Manterrei separato il file js, come già accennato.

2

Questo può essere risolto meglio dall'altra direzione: invece di cercare di non minimizzare un singolo file, aggiungere invece trasformazioni per singoli elementi.

In primo luogo - creare una classe che implementa IItemTransform e utilizza lo stesso codice per minify l'input dato:

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

In secondo luogo - aggiunge questa voce trasformare i singoli file e rimuovere il bundle trasformare:

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