Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [Guida]Comprimere e "pulire" l'html e il css

    Salve a tutti
    E' un pò di tempo che vi seguo ma non ho mai avuto il tempo di scrivere.

    Dunque, ho deciso di fare questa "guida" (per modo di dire) sul come comprimere e/o pulire il codice html e css.

    Chi, come me, ha pagine di 400/500 righe tra Javascript, CSS e Html sa benissimo quanto sia importante comprimere il codice il più possibile. In un sito dinamico poi il problema viene amplificato due volte.

    Quindi, di seguito, elencherò i metodi che conosco per comprimere e pulire l'html e i css.

    Innanzitutto, la prima cosa da fare è validare tutte le pagine del proprio sito -che siano HTML o XHTML- passandole al w3c validator, mezzo che bene o male conoscete tutti.
    La stessa cosa vale anche per i css.

    Una volta fatto, passiamo all'ottimizzazione vera e propria:

    CSSTidy
    CSSTidy è il fratello del celebre HTMLTidy (di cui parlerò più avanti).
    La funzione che svolge è quella di comprimere il css raggruppando i selettori, comprimendo le proprietà (es. background), rimuovendo l'ultimo punto e virgola e così via.
    Tutto questo può essere fatto direttamente online, e precisamente a questo indirizzo.

    Per farlo partire basterà incollare il css nella textarea a sinistra o inserire l'indirizzo del css vicino "CSS from URL:" e premere su "Process CSS".
    Prima però ci sono delle impostazioni (a destra) da settare.
    In particolar modo se utilizzate degli hack come il box model o volete conservare i commenti, dovete spuntare "Preserve CSS" (che in compenso eliminerà molte delle ottimizzazioni possibili).
    Le altre impostazioni si spiegano da sole.
    Queste sono le impostazioni che utilizzo io:

    Compression (code layout): High (o Highest quando so che non lo modificherò più)
    Sort properties, Compress colors, Compress font-weight, Remove unnecessary backslashes, Remove last ; SI
    Preserve CSS, Sort selectors NO

    le altre sono più comodità che vere ottimizzazioni.

    Una volta fatto, controllate il nuovo css e salvatelo.

    Comprimere le pagine html con GZip
    Non starò a spiegare cos'è gzip o come funziona la compressione "al volo" con mod_gzip perchè sarebbe un discorso troppo lungo. Quindi andrò direttamente alla pratica, ovvero "come comprimere le pagine con gzip via php senza conoscere php".

    Comprimere le pagine via gzip è utile sia a diminuire il traffico del vostro sito che a mandare pagine molto più leggere al client. Il difetto principale (l'unico, in verità) è che il continuo comprimere/decomprimere occupa la CPU sia del server che del client. Ma IMHO i pregi sono di molto superiori ai difetti e questo problema si pone raramente.

    Comprimere le pagine è facilissimo via php, l'unica cosa che dovete fare è cambiare l'estensione delle vostre pagine da .html a .php e aggiungere questo codice all'inizio di ogni pagina che volete comprimere:
    Codice PHP:
    <?php
    ob_start
    ("ob_gzhandler");
    ?>
    "GIA' FATTO?!! INCREDIBILE!"

    Ebbene, sì.
    Ovviamente per farlo funzionare il vostro server deve avere php e l'estensione php_gzip installate ma praticamente il 98.9% degli hosting ce l'hanno, compreso qualcuno free (altervista, netsons...).

    Comprimere i css con GZip e gestire la cache
    Comprimere i css con Gzip è più difficile perchè i browser non riconoscono un css se salvato come php senza l'header adatto.
    Vi dico subito che Netscape 4 non decomprime correttamente i css compressi con gzip, quindi per farlo funzionare vi servirà un secondo css non compresso e un browser sniffing in javascript o php.
    Anche se non so se ne vale veramente la pena

    Quindi, una volta salvato il css come file php dovete aprirlo e aggiungere questo codice prima di ogni altra cosa:
    Codice PHP:
    <?php
    ob_start
    ("ob_gzhandler");
    header("Content-type: text/css; charset: UTF-8");
    header("Cache-Control: must-revalidate");
    $offset 60 60 ;
    $ExpStr "Expires: " 
    gmdate("D, d M Y H:i:s",
    time() + $offset) . " GMT";
    header($ExpStr);
    ?>

    Che non è altro che una rivisitazione del primo con l'aggiunta dell'header giusto (content-type: text/css) e della gestione della cache che potete modificare come vi pare cambiando 60 * 60.

    Adesso, per farlo "digerire" alla pagina html dovete importarlo usando @import (ma dai?), ovvero:
    codice:
    <style type="text/css">
    @import url(nome_css.php);
    </style>
    Ottimizzare e pulire il codice con HTML Tidy
    HTML Tidy è un software consigliato dal W3C per "pulire" il codice HTML/XHTML. Potete scaricarlo cliccando qui.

    Per una pulizia veloce potete utilizzarlo online andando al validator del W3C mettendo il segnetto di spunta a "Clean up Markup with HTML Tidy".


    Ho finito, se conoscete altri metodi postateli qui.

    Consigli:
    1)Importate sempre il css (con <link> o @import) e non inseritelo direttamente nell'head così che nel caso modificaste la pagina il css rimarrà nella cache.
    2)Raggruppate i selettori se sono parecchi e hanno tutti almeno 2 o 3 valori uguali
    3)Le tabelle sono tabelle, servono a raggruppare valori non a creare layout... cercate di utilizzare i div, sono molto più leggeri e richiedono anche molto meno codice.
    4)Utilizzate gli Javascript in modo strategico (preload e via dicendo)
    5)Eliminate tutti i <font> e via dicendo e utilizzate i CSS

    E non dimentichiamoci Ajax, lo sto studiando da poco ma sta diventando pian piano il mio miglior amico

    Spero di esservi stato utile.
    Ciao

  2. #2
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    http://www.fiftyfoureleven.com/weblo...ss-gzip-method

    La soluzione che prevede di ripetere quel codice in testa ad ogni file css è inefficiente
    tanto varrebbe racchiuderlo in un file e fare un include. Inoltre l'uso dell'@import può generare il FOUC su Explorer 6

    ma meglio ancora non cambiare affatto estensione ai file .css e utilizzare piuttosto la direttiva auto_prepend_file
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  3. #3
    Originariamente inviato da fcaldera
    http://www.fiftyfoureleven.com/weblo...ss-gzip-method

    La soluzione che prevede di ripetere quel codice in testa ad ogni file css è inefficiente
    tanto varrebbe racchiuderlo in un file e fare un include. Inoltre l'uso dell'@import può generare il FOUC su Explorer 6
    Vero, ma inserire il css con include in ogni pagina renderebbe del tutto inutile la cache, dato che ad ogni modifica della pagina il browser ricaricherebbe anche l'intero css.
    ma meglio ancora non cambiare affatto estensione ai file .css e utilizzare piuttosto la direttiva auto_prepend_file
    Se si ha l'accesso al htaccess è la soluzione migliore. Non tutti gli hosting lo permettono, però.

    Poi vabè, ce ne sono di cose su cui discutere (la compressione zlib è molto più performante di ob_gz_handler, comprimere le pagine parecchio trafficate uccide il server ecc)

    Ciao

  4. #4
    un uppettino credo se lo meriti questo topic, no?

  5. #5
    Continuo allora il discorso del comprimere:

    Comprimere Javascript
    Ci sono tanti software per comprimere Javascript.
    I più famosi sono sicuramente JSMin, che ha una compressione leggera ed è piuttosto sicuro (non cambia il nome delle variabili) e Packer che ha una compressione piuttosto estrema.

    Per questo c'è un sito eccezionale, The Javascript CompressorRater:
    http://compressorrater.thruhere.net/

    basterà inserire il JS nello spazio apposito e premere "CompressorRate It!"
    A quel punto, dopo il caricamento, il sito vi mostrerà una serie di compressioni possibili (con JSMin, Packer, Dojo ShrinkSafe, Packer e gzip (che è inutilizzabile, ma vedremo dopo come fare)).

    Cliccando su View potete vedere il risultato della compressione per copiarlo nel vostro script.

    Sconsiglio come la peste le compressioni estreme come il base62 che si, riducono il peso ma rallentano parecchio l'esecuzione dello script che deve prima decodificare il codice

    Andateci piano anche con le compressioni come Packer con shrink e Yui Compressor senza nomunge perchè cambiano il nome delle variabili per risparmiare spazio causando spesso problemi.

    Consiglio le compressioni JSMin e Yui Compressor con nomunge.

    JSLoader
    Riprendendo il codice di FirtyFourEleven, ho scritto un minuscolo script che permette di caricare dinamicamente il JS che vi serve, comprimerlo con gzip, settare la cache e mandare l'output come text/javascript.
    Io ho aggiunto solo un include e cambiato gli header, ci ho dato un nome solo per bullarmi un pò

    Ecco il codice:
    Codice PHP:
    <?php 
        ob_start 
    ("ob_gzhandler");
        
    header("Content-type: text/javascript; charset: UTF-8");
        
    header("Cache-Control: must-revalidate");
        
    $offset 120 120;
        
    $ExpStr "Expires: " 
        
    gmdate("D, d M Y H:i:s",
        
    time() + $offset) . " GMT";
        
    header($ExpStr);

        include(
    $_GET['js'].'.js');
    ?>
    Copiate e incollate il codice con il Blocco Note o qualsiasi altro software e salvate il file come jsloader.php

    Adesso per caricare uno javascript basterà utilizzare questo codice:
    codice:
    <script type="text/javascript" src="jsloader.php?js=nomejavascript"></script>
    Dove in "nomejavascript" va, appunto, il nome del file javascript senza l'estensione .js

    Buona ottimizzazione

  6. #6
    http://webdesign.html.it/articoli/le...inimizzazione/

    Un pò in ritardo, no?

    Anyway, ecco il nuovo "loader" che supporta sia css che js (potete ampliarlo per supportare a qualsiasi file di testo):
    Codice PHP:
    <?php
    ob_start 
    ("ob_gzhandler");
    header("Cache-Control: must-revalidate");
    $offset 60 60;
    $ExpStr "Expires: " gmdate("D, d M Y H:i:s",time() + $offset) . " GMT";
    header($ExpStr);

    if(
    $_GET['type'] == 'js'){
        
    header("Content-type: text/javascript; charset: UTF-8");
        include(
    $_GET['n'].'.js');
        exit();
    }elseif(
    $_GET['type'] == 'css'){
        
    header("Content-type: text/css; charset: UTF-8");
        include(
    $_GET['n'].'.css');
        exit();
    }else {
        echo 
    $_GET['type'].'? Che stai tentando di fare, di preciso? :°)';
        exit();
    }
    ?>
    esempio di utilizzo (css):
    codice:
    <link rel="stylesheet" type="text/css" href="loader.php?type=css&n=main" />
    o javascript:
    codice:
    <script type="text/javascript" src="loader.php?type=js&n=jquery"></script>
    dove n=NOME_SCRIPT_O_CSS


  7. #7
    Ho modificato un pò il loader, adesso la cache verrà gestita grazie alla data di ultima modifica del file css o js. Se non c'è, il file verrà considerato fresco di modifica.
    Codice PHP:
    <?php
    ob_start 
    ("ob_gzhandler");

    // Gestione cache
    // Ricaviamo il nome del file
    $file $_SERVER["SCRIPT_NAME"];
    $break explode('/'$file);
    $bfile $break[count($break) - 1];
    // Se è presente la data di ultima modifica
    if(filemtime($bfile)){
    // Mandiamo un Expires più lontano possibile
    header("Expires: ".gmdate("D, d M Y H:i:s",time() + 315360000)." GMT");
    // Ricaviamo il last-modified
    $last_mod gmdate('D, d M Y H:i:s',filemtime($bfile)).' GMT';
    // Mandiamo gli header last-modified e if-modified-since usando la data di ultima modifica del file
    header('Last-Modified: '.$last_mod);
    header('If-Modified-Since: '.$last_mod);
    header('Cache-Control: must-revalidate');
    } else {
    // Altrimenti, utilizziamo la data attuale
    header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
    header('If-Modified-Since: '.gmdate('D, d M Y H:i:s').' GMT');
    }

    if(
    $_GET['type'] == 'js'){
        
    header("Content-type: text/javascript; charset=utf-8");
        include(
    $_GET['n'].'.js');
        exit();
    }elseif(
    $_GET['type'] == 'css'){
        
    header("Content-type: text/css; charset=utf-8");
        include(
    $_GET['n'].'.css');
        exit();
    }else {
        echo 
    $_GET['type'].'? Che stai tentando di fare, di preciso? :°)';
        exit();
    }
    ?>
    poi aggiungete questo nel .htaccess per disabilitare gli ETag dei file CSS e JS (altrimenti è tutto inutile):
    Codice PHP:
    <FilesMatch "\.(css|js)$">
    FileETag none
    </FilesMatch
    nella prossima versione implementerò il caching server-side dei file compressi tramite jsmin e cssmin.
    Nel frattempo, se proprio necessitate del caching server-side, potete utilizzare http://farhadi.ir/works/smartoptimizer, che però è un macigno e non so se vale la pena.

  8. #8
    Aggiungo anche queste due funzioni php per eliminare gli spazi utilizzati di solito per indentare il codice nelle pagine html (sono prese da Smarty, non le ho scritte io):
    http://forum.html.it/forum/showthrea...0#post11918240

    esempio di utilizzo (NON utilizzatelo su siti trafficati se non effettuate il caching delle pagine sul server!):
    Create una nuova pagina provapagina.php e inseriteci dentro questo codice:
    Codice PHP:
    <?php
    function trimwhitespace($source){
        
    preg_match_all("!<script[^>]+>.*?</script>!is"$source$match);
        
    $_script_blocks $match[0];
        
    $source preg_replace("!<script[^>]+>.*?</script>!is",'@@@COMPRESSOR:TRIM:SCRIPT@@@'$source);
        
    preg_match_all("!<pre>.*?</pre>!is"$source$match);
        
    $_pre_blocks $match[0];
        
    $source preg_replace("!<pre>.*?</pre>!is",'@@@COMPRESSOR:TRIM:PRE@@@'$source);
        
    preg_match_all("!<textarea[^>]+>.*?</textarea>!is"$source$match);
        
    $_textarea_blocks $match[0];
        
    $source preg_replace("!<textarea[^>]+>.*?</textarea>!is",'@@@COMPRESSOR:TRIM:TEXTAREA@@@'$source);
        
    $source trim(preg_replace('/((?<!\?>)\n)[\s]+/m''\1'$source));
        
    trimwhitespace_replace("@@@COMPRESSOR:TRIM:TEXTAREA@@@",$_textarea_blocks$source);
        
    trimwhitespace_replace("@@@COMPRESSOR:TRIM:PRE@@@",$_pre_blocks$source);
        
    trimwhitespace_replace("@@@COMPRESSOR:TRIM:SCRIPT@@@",$_script_blocks$source);
        return 
    $source;
    }    
    function 
    trimwhitespace_replace($search_str$replace, &$subject) {
        
    $_len strlen($search_str);
        
    $_pos 0;
        for (
    $_i=0$_count=count($replace); $_i<$_count$_i++)
            if ((
    $_pos=strpos($subject$search_str$_pos))!==false)
                
    $subject substr_replace($subject$replace[$_i], $_pos$_len);
            else
                break;
    }    
        
    ob_start(); // non usate ob_start('ob_gz_handler'); o non funzionerà
    ?>

                            Mettete
                                qui
                                    il
                                        codice
                                            HTML
                                                indentandolo
                                                    per
                                                        bene
                                                            per vedere
                                                                l'effetto.

    <?php
    $html 
    trimwhitespace(ob_get_clean());
    echo 
    $html;
    exit();
    ?>
    e, guardando nel sorgente della pagina, vedrete come l'indentazione sia stata rimossa automaticamente dall'html.
    Per vedere meglio l'effetto, provate a cambiare queste righe:
    Codice PHP:
    <?php
    $html 
    trimwhitespace(ob_get_clean());
    echo 
    $html;
    exit();
    ?>
    così:
    Codice PHP:
    <?php
    if(empty($_GET['nospazi'])) $_GET['nospazi'] = 'no';
    if(
    $_GET['nospazi'] == 'yes'){
        
    $html trimwhitespace(ob_get_clean());
        echo 
    $html;
    }
    exit();
    ?>
    e aprite la pagina prima così:
    http://vostrosito.ext/pagina.php
    e poi così:
    http://vostrosito.ext/pagina.php?nospazi=yes
    guardando la differenza tra i sorgenti.

    Ciao

  9. #9
    Trovo inutile far fare al server questo lavoro se poi non si ha la possibilitàù di usare una sorta di cache da aggiornare solo in caso di cambiamenti dei file.

    E' vero che sul sitarello aziendale potrebbe non avere un grande impatto sulle performance, ma se inizio ad usarlo su tutti i siti del mio server rischio un calo di performance.

    O faccio l'ottimizzazione a mano e poi salvo tutto in un'unico .css o .js o se devo automatizzare la procedure DEVO per forza di cosa pensare ad un sistema che ne gestisca la cache.

    Io ho risolto con smartoptimizer semplice script in php non invasivo e di semplice installazione.

    Fa tutto.
    °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    Una terza abbondante (.)(.) non
    è mai una quarta! ( o )( o )
    °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.