Script Combine in una'Applicazione MVC

In un post precedente avevo parlato dell’utilità dello Script Combine introdotto con la Service Pack 1 di ASP.NET, che permette di ridurre le chiamate dal client verso il server riunendo più files Javascript in un unico file.
Purtroppo questa tecnologia non è presente in ASP.NET MVC, ma è facilmente realizzabile andando a creare un HttpHandler che raggruppi in un’unica richesta tutti i files Javascript, ed ottimizzando il risultato tramite quella tecnica chiamata “Minification” (maggiori info le trovate qui.) che consiste nella rimozione degli spazi, newline, ecc dall’output.

L’HttpHandler avrà il compito di leggere il contenuto dei files Javascript dal disco, riunirli in un’unica stringa, ottimizzarla tramite un’apposita classe e mettere il tutto in cache, in modo da non rielaborare tutti i files ad ogni richiesta.

Nel codice seguente potete trovare l’implementazione dell’HttpHandler, che sfrutta una sezione nel file di configurazione per recuperare i files da unire; la parte di “Minification” è basata su questo ottimo post di Rick Strahl.

public class CombineHandler : IHttpHandler
{
    #region IHttpHandler Members

    public bool IsReusable
    {
        get { return false; }
    }

    public void ProcessRequest(HttpContext context)
    {
        string javascriptCombineName = context.Request.QueryString["jscn"];
        string javascritpCombineVersion = context.Request.QueryString["v"];

        string cacheKey = string.Format("JSCOMBINE_{0}_{1}", javascriptCombineName, javascritpCombineVersion);

        string output = context.Cache.Get(cacheKey) as string;

        if (string.IsNullOrEmpty(output))
        {
            output = GetValue(javascriptCombineName, context);

            context.Cache.Insert(cacheKey, output);
        }

        context.Response.ContentType = @"text/javascript";
        context.Response.Write(output);
        context.Response.End();
    }

    #endregion

    private static string GetValue(string javascriptCombineName, HttpContext context)
    {
        string configurationValue = ConfigurationManager.AppSettings[javascriptCombineName];

        string[] files = configurationValue.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries);

        StringBuilder allScripts = new StringBuilder();

        for (int i = 0; i < files.Length; i++)
        {
            string path = context.Server.MapPath(files[i].Trim());

            if (File.Exists(path))
                allScripts.Append(File.ReadAllText(path));
        }

        JavaScriptMinifier jsm = new JavaScriptMinifier();
        return jsm.MinifyString(allScripts.ToString());
    }
}

Download Esempio qui


Comments