ASP.NET

Automatisch komprimierte Javascript-Dateien ausliefern

Dean Edwards Packer als ASP.NET-Handler

Das Web ist ohne Javascript heute kaum noch denkbar. Viele Webseiten implementieren client-seitige Funktionalität, statt alles bereits vorberechnet vom Server zu ziehen. Dementsprechend groß sind mitunter dann auch die Javascripts, die in den Browser geladen werden müssen.

Bandbreite ist zwar kaum noch ein Problem, aber die Benutzer erwarten doch einen schnellen Seitenaufbau. Ein wichtiger Ansatz ist dabei die Funktionen in mehrere kleine Javascript-Dateien zu kapseln und nur die zu laden, die man wirklich benötigt. Aber auch hier kommen schnell einige tausend Zeilen Javascript-Code zusammen. Um die Dateigröße möglichst klein zu halten, bietet sich eine Komprimierung an, wie man sie von ZIP- oder RAR-Archiven her kennt.

Einen wirklich effektiven Packer für Javascript hat der Engländer Dean Edwards vor einigen Jahren veröffentlicht. Das Ding ist sehr effektiv und wohl auch deshalb unter Web-Entwicklern recht beliebt. So komprimiert unter anderem die Truppe um John Resig die Sourcen von jQuery seit der ersten Version mit diesem Algorithmus.

Unter /packer/ bietet Dean ein Web-Formular, mit dem man Scripte sehr schnell und bequem manuell komprimieren kann. Für eine programmatische Komprimierung findet man auf der Seite Links zu einigen Portierungen des Tools in Sprachen wie PHP, Perl, WSH und .NET.

Letztere, die .NET-Portierung von Packer 2.0 von Jesse Hansen, läßt sich wunderbar dazu nutzen, um die eigenen Javascript-Dateien automatisch vor der Auslieferung an den Browser zu komprimieren, denn gerade bei exzessivem Gebrauch der Script-Sprache ist es recht lästig, vor jedem neuen Upload der Sourcen auf den Web-Server schnell noch mal alle Scripte von Hand zu komprimieren. Man schreibt seine Scripte mit soviel Kommentaren und White-Spaces wie man mag. Ausgeliefert wird automatisch der optimierte Code.

Die beiden zuständigen Klassen ECMAScriptPacker.cs und ParseMaster.cs lassen sich entweder direkt in das eigene C#-Projekt übernehmen oder man kann sie schnell in einer entsprechenden Library kompilieren (Download).

Der Abruf der Script-Dateien erfolgt über einen eigenen Handler namens JacascriptFileHandler:

Imports Microsoft.VisualBasic
Imports System.IO
Imports System.Configuration.ConfigurationManager
Imports Dean.Edwards 'Namespace der Packer-Klasse

Public Class JavascriptFileHandler
    Implements IHttpHandler

    Public Sub ProcessRequest( _
        ByVal context As System.Web.HttpContext) _
        Implements System.Web.IHttpHandler.ProcessRequest

        Dim strFileName As String = ""
        Dim strFile As String = ""
        Dim strContent As String = ""

        'Request auslesen
        If Not context.Request.QueryString("f") Is Nothing Then
            strFileName = context.Request.QueryString("f")
        End If

        Try
            'Datei festlegen und prüfen
            strFile = context.Server.MapPath("~/js/" & strFileName & ".js")
            If File.Exists(strFile) = True Then

                'Javascript-Datei auslesen
                Dim sr As StreamReader = File.OpenText(strFile)
                strContent = sr.ReadToEnd
                sr.Close()
                sr.Dispose()

                'Soll die Script-Datei komprimiert werden?
                If CType(AppSettings("DeliverPackedJavascript"), Boolean) = True Then
                    'Javascript packen
                    Dim pk As New ECMAScriptPacker( _
                        ECMAScriptPacker.PackerEncoding.Normal, _
                        True, True)
                    strContent = pk.Pack(strContent)
                End If

            End If
        Catch ex As Exception
        End Try

        'Ausgabe
        context.Response.ContentType = "text/javascript"
        context.Response.Write(strContent)
        context.Response.Flush()
        context.Response.End()

    End Sub

    Public ReadOnly Property IsReusable() As Boolean _
        Implements System.Web.IHttpHandler.IsReusable
        Get
            Return True
        End Get
    End Property

End Class

Mit dem Parameter f wird der Name der Javascript-Datei ohne Dateiendung übergeben, die aus dem Stammordner js ausgeliefert werden soll. Über die in der web.config angelegte AppSetting namens DeliverPackedJavascript wird gesteuert, ob in der aktuellen Konfiguration komprimiert werden soll oder nicht. Damit kann man in seiner Entwicklungsumgebung weiter fleißig debuggen und auf dem produktiven Server wird optimierter Code ausgeliefert.

Den Handler muss man nun noch in der web.config dem System bekannt machen...

    <add verb="GET" path="js.axd" type="JavascriptFileHandler"/>

...und die Verweise in den ASPX-Seiten müssen gerändert werden...

    <script src="~/js.axd?meinescripte" type="text/javascript" runat="server"></script>

...um zum Beispiel die Datei meinescripte.js gepackt zum Browser zu schicken.

Happy Coding :)

kick it on dotnet-kicks.de AddThis 0 wikio-Stimme(n) Trackback-Url...

Schlagworte

Keine Kommentare bislang...

Dein Kommentar hierzu...


Kommentar-Feed für diesen Beitrag
Gravatare werden unterstützt .:. eMail-Adressen werden nicht veröffentlicht
 

RSS-Feed

Die URL des Standard-Newsfeed von zerbit.de lautet:

http://www.zerbit.de/rssfeed.aspx

Login


 

 

Statistik



kürzlich kommentiert

Artikel 276

  • Datum: 26.12.2008
    Kategorie: ASP.NET
    Zugriffe: 2.503
    Kommentare: 0
    Trackbacks: 0

Letzte Beiträge

Kategorien

Buttons & More

Blog-Roll

Banner Piraten-Partei