Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

Gzip voor javascript, css e.d.

Pagina: 1
Acties:

  • R2D2
  • Registratie: Mei 2001
  • Niet online
Goedendag allen ;)

Ik gebruik al een enige tijd Joomla als CMS voor mijn website en toen ik laatst een beetje kritisch aan het kijken was naar de grootte van de pagina's schrok ik daar een beetje van. Wat blijkt echter, het zijn niet de pagina's zelf die te bloated zijn (al zit daar ook nog wel ruimte voor verbetering in) maar vooral de scripts die gebruikt worden op de website. Denk hierbij aan mootools, lightbox script en een script voor het comment systeem. Mootools is de grootste pain in the ass met zijn 73kb.

Nu vond ik via google een manier om javascripts e.d. via Gzip te compressen en te serveren aan de browser echter heeft het nog een voordeel, het stript de complete css van onnodige karakters. De vraag is alleen of het verstandig is dit te gaan gebruiken.

De code ziet er als volgt uit, Javascript en css aanroepen in het template gebeuren van Joomla gaat als volgt.
code:
1
<link rel="stylesheet" href="<?php echo $this->baseurl; ?>/templates/system/gzipcache.php?files=mootools.js,othercode1.js,othercode2.js" type="text/javascript" />


En dan mag dit er nog bij in het template:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<?php

ob_start('ob_gzhandler');

$files = $_GET["files"];

$found = false;

$filearray = explode(",", $files);
foreach ($filearray as $f)
{
   if (substr($f, -4) == ".css")
   {
      header('Content-Type: text/css; charset: UTF-8');
      $found = true;
      $ext = ".css";
      $extlength = -4;
      break;
   }
   else if (substr($f, -3) == ".js")
   {
      header('Content-Type: text/javascript; charset: UTF-8');
      $found = true;
      $ext = ".js";
      $extlength = -3;
      break;
   }
}

if (!$found || !isset($ext) || !isset($extlength))
{
   die("Invalid Call");
   return;
}

header('Cache-Control: must-revalidate');

$expire_offset = 0; // set to a reaonable interval, say 3600 (1 hr)
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expire_offset) . ' GMT');

foreach ($filearray as $f)
{
   if (substr($f, $extlength) == $ext)
   {
      if ($ext == ".css")
         dump_css_cache($f);
      else
         echo file_get_contents($f);
   }
}

//Now the functions

function css_compress($buffer) {
  $buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer);// remove comments
  $buffer = str_replace(array("\r\n", "\r", "\n", "\t", '  '), '', $buffer);// remove tabs, spaces, newlines, etc.
  $buffer = str_replace('{ ', '{', $buffer);// remove unnecessary spaces.
  $buffer = str_replace(' }', '}', $buffer);
  $buffer = str_replace('; ', ';', $buffer);
  $buffer = str_replace(', ', ',', $buffer);
  $buffer = str_replace(' {', '{', $buffer);
  $buffer = str_replace('} ', '}', $buffer);
  $buffer = str_replace(': ', ':', $buffer);
  $buffer = str_replace(' ,', ',', $buffer);
  $buffer = str_replace(' ;', ';', $buffer);
  return $buffer;
}

function dump_css_cache($filename) {
  $cwd = getcwd() . DIRECTORY_SEPARATOR;

  $stat = stat($filename);
  $current_cache = $cwd . $filename . '.' . $stat['size'] . '-' . $stat['mtime'] . '.cache';

  // the cache exists - just dump it
  if (is_file($current_cache)) {
    include($current_cache);
    return;
  }

  // remove any old, lingering caches for this file
  if ($dead_files = glob($cwd . $filename . '.*.cache', GLOB_NOESCAPE))
    foreach ($dead_files as $dead_file)
      unlink($dead_file);

  if (!function_exists('file_put_contents')) {
    function file_put_contents($filename, $contents) {
      $handle = fopen($filename, 'w');
      fwrite($handle, $contents);
      fclose($handle);
    }
  }

  $cache_contents = css_compress(file_get_contents($filename));
  file_put_contents($current_cache, $cache_contents);

  echo $cache_contents;
}
?>


De vraag is, is het slim om naar een dergelijke manier te gaan kijken OF is het slimmer om de zaak links te laten liggen? Naast dit alles ben ik overigens al bezig met optimalisatie van zaken als template images door ze vanuit 1 sprite aan te gaan roepen e.d. maar bovenstaand leek me daarnaast ook een aanlokkelijke optie.

iRacing profiel | Sim-Racer.nl


  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Het hangt van een aantal punten af, wat je nu doet is niet alleen het weghalen van de overbodige code maar ook het samenvoegen van de code wat het aantal http requests verminderd. Dit is een voordeel voor de gebruiker, maar als je vaak je broncode veranderd (en dus elke keer het volledig bestand moet downloaden) is het weer minder prettig.

Voor mijn werk heb ik een vergelijkbaar script gemaakt, maar dan in combinatie met de YUI Compressor, die werkt voor CSS en Javascript prima en geeft (naar mijn ervaring) nooit problemen met de Javascript die eruit komt (in tegenstelling tot een lading andere packers). Kijk maar naar de CSS en Javascript in de broncode voor een voorbeeld :)

Blog [Stackoverflow] [LinkedIn]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:02

crisp

Devver

Pixelated

minification heeft over het algemeen nog maar een kleine extra winst boven gewoon gzip compressie. Ik zou beginnen door gewoon gzip compressie via je webserver te regelen (mod_gzip of mod_deflate) en daarnaast er voor te zorgen dat statische files een ver in de toekomst liggende expires header krijgen.

Intentionally left blank


  • R2D2
  • Registratie: Mei 2001
  • Niet online
crisp schreef op dinsdag 19 augustus 2008 @ 01:41:
minification heeft over het algemeen nog maar een kleine extra winst boven gewoon gzip compressie. Ik zou beginnen door gewoon gzip compressie via je webserver te regelen (mod_gzip of mod_deflate) en daarnaast er voor te zorgen dat statische files een ver in de toekomst liggende expires header krijgen.
Gzip maak ik op het moment al gebruik van, dus dat is geregeld.

Statische files een langere expire tijd mee geven is inderdaad ook wel een goede optie en "denk ik" ook een minder risicovolle optie dan minification of zit ik er dan naast?
Wolfboy schreef op dinsdag 19 augustus 2008 @ 01:39:
Kijk maar naar de CSS en Javascript in de broncode voor een voorbeeld :)
Heb ik ook al naar zitten kijken, het "nadeel" is echter dat ik dan zelf alle css en scripts door een compressor heen moet gaan trekken voor ik ze upload terwijl de optie die ik poste al het werk voor me doet in principe en ik dus gewoon mijn standaard css files welke voor mij netjes voorzien zijn van comments kan uploaden. Het is natuurlijk een werkje van niks dat ben ik alvast met je eens ;)

Zit nu op 43 requests waarvan het merendeel images is. Door die in een sprite te gooien moeten er al een stuk of 15 tot 20 requests af kunnen dus dat scheelt al een mooi beetje. Het enige waar ik dan nog mee zit is de scripts zoals mootools. Wat ik ook nog zou kunnen doen is kijken wat ik aan mootools nodig heb op de frontpage en al het overbodige er uit slopen. Nu word standaard het complete pakket mee gestuurd (standaard iets van Joomla) maar dat zou ook nog een optie kunnen zijn. Vraag is alleen hoe de gebruikte componenten op de site daar mee om gaan.

[ Voor 50% gewijzigd door R2D2 op 19-08-2008 02:02 ]

iRacing profiel | Sim-Racer.nl


  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Reind schreef op dinsdag 19 augustus 2008 @ 01:51:
Gzip maak ik op het moment al gebruik van, dus dat is geregeld.

Statische files een langere expire tijd mee geven is inderdaad ook wel een goede optie en "denk ik" ook een minder risicovolle optie dan minification of zit ik er dan naast?
Minification is in principe niet risicovol, zolang de code dezelfde functionaliteit blijft houden (wat wel zou moeten). De langere expire tijd is altijd een goed idee (voor alle css/js doe ik standaard 1 jaar) maar let er dan wel op dat je de bestanden per versie een andere naam geeft aangezien ze anders met een beetje pech het komende jaar niet meer uitgelezen gaan worden.
Heb ik ook al naar zitten kijken, het "nadeel" is echter dat ik dan zelf alle css en scripts door een compressor heen moet gaan trekken voor ik ze upload terwijl de optie die ik poste al het werk voor me doet in principe en ik dus gewoon mijn standaard css files welke voor mij netjes voorzien zijn van comments kan uploaden. Het is natuurlijk een werkje van niks dat ben ik alvast met je eens ;)
In mijn geval heb ik het script op de server draaien en gaat het aanroepen dus op een vergelijkbare manier als wat jij nu doet, het levert mij en de andere developers dus geen extra werk op, eerder minder aangezien je geen last van cached css/javascript meer kan hebben.

Blog [Stackoverflow] [LinkedIn]


Verwijderd

Volgens mij werkt GZip niet op CSS bestanden icm IE6
Die heeft dan gewoon helemaal geen CSS, dus ziet er bijzonder on-fraai uit :P

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Gelukkig heeft Apache een lading regels voor incorrect werkende browsers, hier zou ik me dus niet zoveel zorgen om maken. Sowieso zal Apache alleen maar gzipped content sturen als de browser zegt die encoding te accepteren :)

edit:
Dit gaat er uiteraard wel vanuit dat je mod_deflate gebruikt zoals Crisp al zei

[ Voor 16% gewijzigd door Wolfboy op 19-08-2008 02:59 ]

Blog [Stackoverflow] [LinkedIn]


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 11-11 10:24

Bosmonster

*zucht*

Wat je eventueel ook nog kunt proberen is packer:

http://dean.edwards.name/packer

Scheelt vaak nog 20-30% op min/yui compressed code.

mootools is na packer nog 40K (ipv 60K met YUI). Na ZIP-compressie nog 18K ongeveer.

Overigens maakt het inderdaad niet zoveel uit welke clientside 'compressie' je gebruikt als je ook al GZIP gebruikt. Maar niet zoveel is nog steeds wel iets.

[ Voor 49% gewijzigd door Bosmonster op 19-08-2008 09:36 ]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:02

crisp

Devver

Pixelated

Het nadeel van packer is dat elke pageview de javascript middels z'n eigen routine weer 'unpacked' moet worden wat clientside weer een performance hit geeft. Die paar procent extra winst na gzip en andere vormen van minification zou ik er niet voor over hebben.

Sowieso is minification dmv white-space stripping nog redelijk 'safe', maar zodra je daadwerkelijk variabelenamen gaat aanpassen e.d. neemt de kans op bugs geintroduceerd door het verkleinen navenant toe, plus dat het nogal wat eisen met zich meebrengt qua syntax (verplichte semi-colons e.d.).

Overigens zou ik het script uit de topicstart niet gebruiken; de expires wordt daar al teniet gedaan door de must-revalidate en het complete gebrek aan if-modified-since checking; je kan dan net zo goed helemaal niet cachen...

Intentionally left blank


  • Urk
  • Registratie: Maart 2000
  • Laatst online: 00:43

Urk

Dus crisp, zou je dan niets gebruiken? Vroeg me idd ook al af of packer niet een grote performance vraagt aan de clientside voor de Javascript.
Lees net dit topic en vraag mij ook af wat de beste methode is om het aantal HTTP request aan te pakken en CSS en Javascript te stripen?

Ik schrijf overigens mijn CSS altijd al achter elkaar, elke selector wel op een nieuwe regel maar dat vindt ik wel erg lekker werken moet ik zeggen.
crisp schreef op dinsdag 19 augustus 2008 @ 09:39:
Het nadeel van packer is dat elke pageview de javascript middels z'n eigen routine weer 'unpacked' moet worden wat clientside weer een performance hit geeft. Die paar procent extra winst na gzip en andere vormen van minification zou ik er niet voor over hebben.

Sowieso is minification dmv white-space stripping nog redelijk 'safe', maar zodra je daadwerkelijk variabelenamen gaat aanpassen e.d. neemt de kans op bugs geintroduceerd door het verkleinen navenant toe, plus dat het nogal wat eisen met zich meebrengt qua syntax (verplichte semi-colons e.d.).

Overigens zou ik het script uit de topicstart niet gebruiken; de expires wordt daar al teniet gedaan door de must-revalidate en het complete gebrek aan if-modified-since checking; je kan dan net zo goed helemaal niet cachen...

Verwijderd

Focus je maar niet op hoe je het zo klein mogelijk maakt. Gewoon GZIP'pen.

Waar je meer op moet letten is je aantal requests zo laag mogelijk krijgen. Daarover heb ik uitvoerig geschreven, paar tips:
- Verklein je aantal HTTP-requests. link
- Far future expiry/ETags en andere vormen van caching. link
- Algemeen stukje over minificatie. link
- Eventueel CSS-sprites.
- Eventueel tweede domein of CDN voor static content.

Over het algemeen beschrijf ik hier overigens gewoon de Yahoo Exceptional Performance guidelines. Redelijk algemeen geaccepteerd :)

Overigens heb ik regelmatig vreemde, vreemde dingen meegemaakt met GZIP en IE6. Kan voor veel hoofdbrekens zorgen ;(

[ Voor 7% gewijzigd door Verwijderd op 19-08-2008 10:13 ]


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 11-11 10:24

Bosmonster

*zucht*

Urk schreef op dinsdag 19 augustus 2008 @ 09:47:
Dus crisp, zou je dan niets gebruiken? Vroeg me idd ook al af of packer niet een grote performance vraagt aan de clientside voor de Javascript.
Performance problemen ben ik persoonlijk nog niet tegengekomen met packer en gebruik het eigenlijk continu voor de jQuery basis. Hij 'unpackt' het ook tijdens het laden en de rest van je javascipt acties vinden toch pas plaats nadat de rest van het document is geladen (domready). Dat valt in mijn ervaring zo goed als samen. Heb er nog geen vertragingen mee meegemaakt in ieder geval.

Ik ben nooit zeker waar de site komt te draaien en of daar GZIP ondersteund/gebruikt wordt. Dus mijn opgeleverde clientside code moet gewoon goed werken en zo klein mogelijk zijn. Alle compressie daarna is mooi meegenomen.

  • R2D2
  • Registratie: Mei 2001
  • Niet online
Nou zojuist even bezig geweest met het compressen van wat javascripts en css en meteen even wat afbeeldingen gecombineerd met een uiteindelijke winst van 48kb (zonder ads weegt de pagina nu nog maar 265kb). Toch een winst van pak hem beet 20% ten opzichte van de oude situatie.

Pagina requests naar beneden trekken valt een klein beetje tegen. Nadat ik alle css bij elkaar in heb gegooid en wat images gecombineerd heb kom ik uit op 36 requests + die van het draaiende ad systeem zit ik op 41.

Anyway... we gaan gewoon weer verder met knutselen ;)

[ Voor 4% gewijzigd door R2D2 op 19-08-2008 14:03 ]

iRacing profiel | Sim-Racer.nl

Pagina: 1