««« | »»»
Git e l’ottimizzazione delle immagini
Si sa. Una delle cose da fare per ottimizzare le prestazioni di un sito è quella di scegliere accuratamente il formato delle immagini e ridurne il più possibile le dimensioni.1 Analogamente anche i css e javascript andrebbero ridotti usando la miniaturizzazione.2
Qual è il problema?
Queste ottimizzazioni però possono diventare un bell’intralcio se non automatizziamo tutti i passi necessari. Le immagini potrebbe essere ottimizzate prima dell’aggiunta al progetto ma spesso vengono passate avanti e indietro prima di diventare definitive; per non parlare dei css o degli script, che possono essere trattati solo all’ultimo momento prima del deployment.3
Usiamo git
Ho pensato quindi di sfruttare git, agganciando il post-processamento di questi file al momento dell’esportazione, quando viene creato il pacchetto d’installazione.4
Per farlo dobbiamo modificare due file: config e info/attributes. Nel primo impostiamo i filtri:
[filter "minify-css"]
clean = cat
smudge = java -jar /usr/local/bin/yuicompressor-2.4.2.jar --charset UTF8 --type css
[filter "minify-js"]
clean = cat
smudge = java -jar /usr/local/bin/yuicompressor-2.4.2.jar --charset UTF8 --type js
[filter "optimize-img"]
clean = cat
smudge = /Users/giorgio/bin/optimize-imgs
Nel secondo specifichiamo i criteri di selezione dei file a cui applicare questi filtri:
*.css filter=minify-css *.js filter=minify-js *.png filter=optimize-img *.gif filter=optimize-img *.jpg filter=optimize-img *.jpeg filter=optimize-img
Aggiriamo il problema della pipeline
Il problema principale è che git usa delle pipeline5 per il processamento e non tutte le utilities usate per l’ottimizzazione sono pensate per essere impiegate in questo modo, in particolare pngcrush. La funzione di optimize-imgs è quindi quella di fornire un minimo di uniformità nell’utilizzo.
Lo script è incluso direttamente qui e presuppone di trovare nel PATH pngcrush, jpegtran e convert (ovvero, ImageMagick). Inoltre richiede tcllib, che è una dipendenza di cui potrei fare a meno ma adesso non ho voglia di cambiare lo script! ;-)
#! /usr/bin/env tclsh
package require cmdline
variable tmpFile /tmp/image
interp alias {} pngcrush {} exec pngcrush -rem alla -brute -reduce
interp alias {} jpegtran {} exec jpegtran
interp alias {} convert {} exec convert
interp alias {} cat {} exec cat
interp alias {} fileType {} exec file --brief --mime-type
proc createTempFile {} {
variable tmpFile
cat > $tmpFile
switch [fileType /tmp/image] {
{image/png} {
set ext png
}
{image/gif} {
set ext gif
}
{image/jpeg} {
set ext jpg
}
}
file rename -force $tmpFile $tmpFile.$ext
return $tmpFile.$ext
}
proc optimize img {
switch -glob -- $img {
*.jpg -
*.jpeg {
set proc optimizeJPEG
}
*.png {
set proc optimizePNG
}
*.gif {
set proc optimizeGIF
}
}
$proc $img /tmp/opt-image
}
proc optimizePNG {img dest} {
pngcrush -rem alla -brute -reduce $img $dest > /dev/null
}
proc optimizeGIF {img dest} {
convert -quiet $img $dest > /dev/null
}
proc optimizeJPEG {img dest} {
set progressiveVariant [file dirname $dest]/prog-[file tail $dest]
jpegtran -copy none -optimize -outfile $dest $img
jpegtran -copy none -progressive -outfile $progressiveVariant $img
if {[file size $dest] > [file size $progressiveVariant]} {
file rename -force $progressiveVariant $dest
} else {
file delete $progressiveVariant
}
}
proc main {args} {
set args [::cmdline::getoptions args {
f.arg {}
} errore]
dict with args {
if {[string is false $f]} {
set img [createTempFile]
optimize $img
cat /tmp/opt-image >@ stdout
} else {
optimize $f
file rename -force /tmp/opt-image opt-[file tail $f]
}
}
}
main {*}$::argv
- Image optimization. Sono quattro post che affrontano in modo approfondito la questione. ↩
- Come vedrete di seguito, uso YUI Compressor ↩
- A meno che vi piaccia leggere i file miniaturizzati! ↩
- Git Attributes. ↩
- Unix pipeline: a set of processes chained by their standard streams, so that the output of each process (stdout) feeds directly as input (stdin) to the next one. ↩
Per proseguire
Commenti e trackback sono disabilitati.
Commenti su Git e l’ottimizzazione delle immagini
Una risposta
Tweets that mention Git e l’ottimizzazione delle immagini - ReFactor.it -- Topsy.com (10/02/11)
[…] This post was mentioned on Twitter by GP, giorgio_v. giorgio_v said: Nuovo post: Git e l’ottimizzazione delle immagini http://refactor.it/2011/02/09/git_and_image_optimizations/ […]