CRS Webbproduktion
Webbproduktion när den är som bäst

Minimera både CSS och JavaScript

juli 1, 2009 09:46 by Admin

Igår skrev jag om hur du kan minimera datatrafiken genom att sammanfoga CSS-filer och ta bort whitespaces.

Idag har jag utökat funktionaliteten så att den även fixar dina JavaScript på samma sätt. Det enda krångliga var att hantera kommentarer, vilket jag fick hjälp med via en tråd på webmasterworld.

Här är den uppdaterade koden:

<%@ WebHandler Language="C#" Class="CssCompact" %>

using System;
using System.Web;
using System.IO;
using System.Text.RegularExpressions;

public class CssCompact : IHttpHandler
{
    private static Regex _remove = new Regex(@"^\s+|/\*([^*\\\\]|\*(?!/))+\*/|\r|\n|\t|((^[\/]{2}[^\n]*)|([\n]{1,}[\/]{2}[^\n]*)/g)", RegexOptions.Multiline | RegexOptions.Compiled);
    public void ProcessRequest(HttpContext c)
    {
        string cachename = "";
        string content = "";
        string[] resources = c.Request.QueryString["resource"].Split(',');
        for (int i = 0; i < resources.Length; i++)
        {
            cachename += resources[i];
            if (resources[i].EndsWith(".css"))
            {
                c.Response.ContentType = "text/css";
            }
            else if (resources[i].EndsWith(".js"))
            {
                c.Response.ContentType = "text/javascript";
            }
            else
            {
                c.Response.End();
            }
        }
        //c.Cache.Remove(cachename);
        try
        {
            content = c.Cache[cachename].ToString();
        }
        catch
        {
            for (int i = 0; i < resources.Length; i++)
            {
                string resource = resources[i];
                if (resource != null)
                {
                    string filename = c.Server.MapPath(resource);
                    if (File.Exists(filename))
                    {
                        FileInfo f = new FileInfo(filename);
                        c.Response.AddHeader("Last-Modified", f.LastWriteTime.ToString("U"));
                        c.Response.Expires = 10000;
                        if (c.Request.HttpMethod != "HEAD")
                        {
                            using (StreamReader stream = f.OpenText())
                            {
                                // remove linebreaks, whitespace and comments
                                content += stream.ReadToEnd();
                            }
                        }
                    }
                }
            }
            content = _remove.Replace(content, "");
            c.Cache.Add(cachename, content, null, DateTime.Now.AddHours(1), TimeSpan.Zero, System.Web.Caching.CacheItemPriority.Default, null);
        }
        c.Response.Write(content);
        c.Response.End();
    }
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

}

Nu är koden uppdaterad för att både kompilera uttrycket, samt implementera cache. Viktigt att notera är att om du byter ordning på dina Querystrings så blir det en ny cache. För mig är det oftast inget problem, då jag refererar i min MasterPage.


Lägg till kommentar




  Country flag

biuquote
  • Kommentar
  • Live överblick
Loading