17 mei 2013Drupal is traag. Of niet?
duurzame websitesWaarom is snelheid belangrijk?
• Google:
100 ms = 10% minder traffic,
500 ms = 20% minder traffic
• Amazon: elke 100ms trager = 1% minder sales
• Google rankt snelle sites hoger
• De meeste rendertijd in de
front-end (JavaScript, CSS3)
Begin met de 80%
duurzame websitesCSS bovenaan & JS onderaan
• CSS blokkeert het renderen, zet deze dus in je <head>
• JS blokkeert downloaden, zet deze dus voor je </body>
• In Drupal kan dit vrij makkelijk met hook_js_alter en hook_css_alter.
duurzame websitesCSS bovenaan & JS onderaan
• CSS blokkeert het renderen, zet deze dus in je <head>
• JS blokkeert downloaden, zet deze dus voor je </body>
• In Drupal kan dit vrij makkelijk met hook_js_alter en hook_css_alter.
• Toch hier bezig? Dan gelijk ook minder code!
duurzame websitesMaak minder requests
• CSS & Javascript aggregatie aanzetten
• Lazy loading (content pas laden als het in beeld komt).
• Gebruik Image Sprites
duurzame websitesSprites op Hero.nl
• 47 ingredienten
• Samengevoegd
tot 1 afbeelding
• Daarnaast nog 1
sprite voor icons
duurzame websitesGebruik parallellisatie
• Gebruik een extra domein (of meer) voor je assets.
assets.domein.nl, static.domein.nl of beter: www.imgdomain.com
• Let wel: een DNS lookup is traag (20 - 120 ms).
Dit hoeft gelukkig maar 1x per domein.
• CSS daarom vanaf je hoofddomein (geen extra DNS lookup).
• Handvat: ~20 assets per domein.
• Let op cookies ivm caching. Serveer assets van een cookie-less
domein.
duurzame websitesLeg je focus op de CSS
CSS is een bottleneck (het blokkeert rendering), dus:
• Gooi onnodige CSS weg (hook_css_alter() of in je theme settings)
• Niet vanaf een CDN versturen, maar van zelfde domein als HTML
• Zet het in de <HEAD>
• Concatenate het:$conf['preprocess_css'] = 1;
• Gzip (standaard Drupal) en minify het:SASS: output_style = :compressed
• Cache maximaal!
duurzame websitesDNS prefetching
Externe scripts? Gebruik DNS prefetching:<link rel="dns-prefetch" href="//widget.externdomein.com">
Kan ook voor assets handig zijn in geval van afbeeldingen:
<div class=”hidden”><img src=”sprite” alt=”” /></div>
<link rel="prefetch" href="sprite.png">
duurzame websitesProgressive JPG’s
• Veel belangrijker dan de exacte laadtijd is de beleving van de
gebruiker. Beter een wazig plaatje dan een half plaatje.
• Of nog beter: helemaal geen plaatjes (SVG, CSS)
duurzame websitesProgressive JPG’s
• Veel belangrijker dan de exacte laadtijd is de beleving van de
gebruiker. Beter een wazig plaatje dan een half plaatje.
• Of nog beter: helemaal geen plaatjes (SVG, CSS)
duurzame websitesHoe meet je het?
Google Page Speed en Firebug / Chrome DEV Tools
duurzame websitesCaching in Drupal: settings
• Page caching zet
max-age headers.
• Page caching
voor uitgelogd
• 10 min cache
lifetime altijd aan
• Block caching
wordt genegeerd
bij page caching
duurzame websitesCaching in Drupal: code
Voor caching binnen 1 page request.
Wordt bijvoorbeeld gebruikt in node_load().
function my_module_function() { $my_data = &drupal_static(__FUNCTION__); if (!isset($my_data)) { // Hier een zware berekening. } return $my_data;}
duurzame websitesCaching in Drupal: code
Database-caching (tot een cache clear).
function my_module_function() { $my_data = &drupal_static(__FUNCTION__); if (!isset($my_data)) { if ($cache = cache_get('my_module_data')) { $my_data = $cache->data; } else { // Zware berekening. cache_set('my_module_data', $my_data,'cache'); } } return $my_data;}
duurzame websitesCaching in Drupal: code
Caching in een render array.
$content['my_content'] = array( '#cache' => array( 'cid' => 'my_module_data', 'bin' => 'cache', 'expire' => time() + 360, ),);
duurzame websitesBack-end performance
• Apache: mod_php of FastCGI ipv CGI.
.htaccess settings in httpd.conf opslaan
• Cache PHP code met APC/eAccellerator
• MySQL tuning: MySQL query cache, persistent DB connections
http://drupal.org/node/51263
• Varnish/Squid/Boost voor anonieme bezoekers
• Authenticated User Page Caching (Authcache) voor ingelogde
bezoekers
duurzame websitesNog twee tips
Specifieke selectors in CSS.selector is sneller dan .body .page .selector
DOM aanpassen met jQuery is traagDoe dit zo min mogelijk. Beter eerst je aanpassingen in JS doen en ineens wegschrijven
naar de DOM.
duurzame websitesLeesvoer
• https://developers.google.com/speed/docs/best-practices/request
• http://developer.yahoo.com/performance/rules.html
• http://csswizardry.com/2013/01/front-end-performance-for-web-
designers-and-front-end-developers/
Vragen?
[email protected] | @BarisW | www.limoengroen.nl | 020 - 737 1880