7

Sono ASP.NET MVC v4 per la mia applicazione e sto utilizzando le funzioni di ottimizzazione web (raggruppamento e minificazione di script e stili).C'è un modo per aggiornare dinamicamente i contenuti del bundle di asp.net mvc in fase di esecuzione?

Ora, ciò che capisco è (correggimi se è sbagliato), il framework di ottimizzazione guarderà i file inclusi al momento della compilazione e li configurerà. Creerà un numero di versione (v = qualcosa) in base ai contenuti. Ogni volta che il contenuto cambia, verrà ricreato l'hash della versione e il client riceverà i file aggiornati.

Ora, c'è un modo per ottenere il seguente fatto

[1] Aggiornare qualcosa all'interno di un file js nel mio server, e servire quelle aggiornate ai clienti senza ri-costruire & riavviare l'applicazione (Non sto cambiando la configurazione del pacchetto qui, semplicemente aggiornando il contenuto del file all'interno di uno script)?

[2] Aggiornare la configurazione dello script (ad esempio aggiungendo un nuovo script a un pacchetto) e ottenere quello servito ai client senza Ricompilazione & Riscorrendo l'applicazione? O, almeno senza ricompilare? (Lo so, generalmente definiamo i pacchetti all'interno dei file cs, ma ci chiediamo se c'è una via d'uscita!)

[3] C'è un modo per usare il mio numero di versione (ad esempio da un file di configurazione, v = myCustomScriptVersion) piuttosto che l'hash della versione generata automaticamente?

+0

I pacchetti non vengono configurati durante la compilazione, sono configurati in fase di esecuzione durante Application_Start. – danludwig

+0

@danludwig, i contenuti del bundle sono effettivamente definiti in fase di compilazione. – haim770

+1

@ haim770 sono definiti in fase di compilazione, ma sono configurati in fase di runtime. Appplication_Start chiamerà BundleConfig.RegisterBundles, che aggiunge i bundle alla raccolta. Questo codice viene eseguito ... in fase di esecuzione. – danludwig

risposta

7

È un po 'tardi, ma sto solo condividendo la mia esperienza con le mie domande qui.

Come discusso nei commenti della domanda, i pacchetti sono definiti come parte di un file cs (generalmente BundleConfig.cs all'interno di App_Start). Quindi, i pacchetti vengono definiti in fase di compilazione e all'avvio dell'applicazione verranno aggiunti alla raccolta e diventeranno utilizzabili.

Ora, il bit interessante. In fase di esecuzione, il framework di ottimizzazione esamina i file inclusi e crea un hash del contenuto e lo aggiunge come una stringa di query versione alla richiesta di bundle. Quindi, quando il bundle viene chiamato l'uri generato è come quello sottostante.

http://example.com/Bundles/MyBundledScripts?v=ILpm9GTTPShzteCf85dcR4x0msPpku-QRNlggE42QN81

Questo numero di versione v = ... è completamente dinamico. Se viene modificato qualsiasi contenuto di file all'interno del pacchetto, questa versione verrà rigenerata e rimarrà invariata.

Ora per rispondere alle domande,

[1] Questo viene fatto automaticamente dal framework, non c'è bisogno di fare qualcosa in più per questo. Ogni volta che viene modificato il contenuto di un file, verrà generato un nuovo numero di versione e i client riceveranno gli script aggiornati.

[2] Non possibile. Se i file inclusi in un pacchetto vengono modificati, è necessario ricompilare.

[3] Sì, può essere utilizzato. Il numero di versione personalizzato può essere aggiunto come di seguito.

@Scripts.Render("~/Bundles/MyBundledScripts?v=" + ConfigurationManager.AppSettings["ScriptVersion"]) 

Ma Attenzione! Ciò rimuoverà il controllo automatico delle versioni in base al contenuto del file.

e, inoltre, se ci sono più versioni dello stesso file disponibili e abbiamo sempre desidera includere l'ultima versione disponibile, che può essere raggiunto facilmente, includendo una versione {} jolly in configurazione fascio come qui di seguito.

bundles.Add(new ScriptBundle("~/Bundles/MyBundledScripts") 
      .Include(
       "~/Scripts/Vendor/someScript-{version}.js" 
      )); 

Quindi, se ci sono 2 gli script nella cartella /Scripts/Vendor someScript-2.3.js someScript-3.4.js

Poi il file someScript-3.4.js (versione superiore) otterrà automaticamente inclusa. E quando un nuovo file someScript-4.0.js viene aggiunto alla cartella, verrà servito ai client senza bisogno di ricompilare/riavviare.