Steffen: durch jquery verursachten Traffic reduzieren

Hi,

auf einer Websit ist mit <script type="text/javascript" src="js/jquery.js"></script> jquery eingebunden.
Obwohl es die komprimierte Version ist, erzeugt der ständige Abruf der Datei ca. 30% des gesamten Traffics!

Warum legen die Browser diese (statische) Datei nicht in ihrem cache ab?

Kann man gegen diesen unnützen Traffic etwas tun?

Gruß

Steffen

  1. Tach!

    Warum legen die Browser diese (statische) Datei nicht in ihrem cache ab?

    Tun sie das wirklich nicht? Hast du das bei dir mit einem Browser in Standardeinstellung überprüft? Welche Angaben macht dein Server zum Caching?

    Kann man gegen diesen unnützen Traffic etwas tun?

    Zum Beispiel einen der CDN-Provider verwenden.

    dedlfix.

  2. dedlfix hat dich bereits richtig auf den CDN hingewiesen.

    Das stößt aber manchmal auf Bedenken rechtlicher oder technischer Natur.

    Ratschläge hierzu:

    1.)
    Verwende die "minifizierte" Version. Die ist viel kleiner!

    2.)
    Gib die Version mit an - Falls Du die Version mal wechselst holt der Browser dann auch die richtige ab. Mit 'src="js/jquery.js"' wird das nicht funktionieren. etwas wie "/js/jquery-1.9.1.min.js" ist also besser.

    3.)
    Du solltest, Dedlfix hat es richtig erwähnt, Header verwenden.

    4.)
    Packe die Dateien. Es ist keine schlechte Idee, die Dateien komprimiert (hier mit gz) vorzuhalten und diese an den Client auszuliefern. Content Negoation wäre hier also statt mod deflate oder dem Skript unten das Mittel der Wahl. Falls das nicht einzurichten geht habe ich noch eine Lösung in PHP, die aber entweder eine Anpassung des Links oder aber eine Regel in der htaccess nötig macht.

    Statt jetzt dafür ein Beispiel zu liefern stelle ich Dir meine Cache-Funktion (Die ist für (m)ein CMS) vor. Die schaut nach, ob es einen Cache der Datei gibt (das entfällt bei Dir), dann ob der Browser Gezipptes akzeptiert.

    Wenn der Browser Gezipptes NICHT akzeptiert liefert der Server den Klartext, sonst die statisch vorhandene gezippte Version der Datei aus. (Ist die datei nicht vorhanden wird die Webseite "on the fly"aus den Daten erzeugt, die Cache-Datei und deren gezippte Version erzeugt und die Webseite zum Client geschickt- davon ist aber in der Funktion nichts zu sehen...)

    Beachte also: Du musst das an Deine Erfordernisse anpassen - Beachte hier auch die von dedlfix schon erwähnten header, die natürlich z.B. mittels .htaccess in Deinem JS-Verzeichnis zu setzen sind.

    function TestAndSendCache() {  
            $BrowserCacheDauer=60*60*24*3; #Sekunden - #Beispiel:Drei Tage  
      
            if ( isset ($_REQUEST['seite']) && (! 'Error 404'==$_REQUEST['seite']) )  {  
                    return false;  
            }  
      
            if (is_dir('data/cache/'))  {  
                    $CacheDir='data/cache/';  
            } else {  
                    return false;  
            }  
            if (! isset($_SERVER['HTTP_ACCEPT_ENCODING'])) {  
                    $_SERVER['HTTP_ACCEPT_ENCODING']=false;  
            }  
            $exp_gmt = gmdate("D, d M Y H:i:s", time() + $BrowserCacheDauer) . ' GMT';  
            $mod_gmt = gmdate("D, d M Y H:i:s", getlastmod()) . ' GMT';  
            if (false===strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) {  
                    $CacheFile=$CacheDir.md5($_SERVER["REQUEST_URI"]);  
                    if (is_file($CacheFile) && is_readable($CacheFile)) {  
                            header ('Expires: ' . $exp_gmt);  
                            header ('Cache-Control: public, max-age=' . $BrowserCacheDauer);  
                            readfile($CacheFile);  
                            exit;  
                    }  
            } else {  
                    $CacheFile=$CacheDir.md5($_SERVER["REQUEST_URI"]).'.gz';  
                    if (is_file($CacheFile) && is_readable($CacheFile)) {  
                            header ('Expires: ' . $exp_gmt);  
                            header ('Cache-Control: public, max-age=' . $BrowserCacheDauer);  
                            header ('Vary: Accept-Encoding');  
                            header ('Content-Encoding: gzip');  
                            readfile($CacheFile);  
                            exit;  
                    }  
      
            }  
            return false;  
    }  
    
    

    Jörg Reinholz