escribí un script de construcción que duplica mis plantillas en otro directorio y luego usar este truco para decirle a mi solicitud para seleccionar la plantilla correcta en el modo de desarrollo, o en la producción:
DEV = os.environ['SERVER_SOFTWARE'].startswith('Development') and not PRODUCTION_MODE
TEMPLATE_DIR = 'templates/2012/head/' if DEV else 'templates/2012/output/'
si su servidor web no tiene gzip, este no es el punto, debes guardar cada byte que puedas para razones de rendimiento.
Si nos fijamos en algunos de los sitios más grandes por ahí, que a menudo hacen cosas como escribir HTML válido para salvar bytes, por ejemplo, es común omitir las comillas dobles en los atributos id en etiquetas HTML, por ejemplo:
<did id=mydiv> ... </div>
En lugar de:
<did id="mydiv"> ... </div>
Y hay varios ejemplos como éste, pero eso no viene al alcance de la rosca supongo.
Volviendo a la pregunta, armé un pequeño script de compilación que minimiza su HTML, CSS y JS. Advertencia: no cubre el caso de la etiqueta PRE.
import os
import re
import sys
from subprocess import call
HEAD_DIR = 'templates/2012/head/'
OUT_DIR = 'templates/2012/output/'
REMOVE_WS = re.compile(r"\s{2,}").sub
YUI_COMPRESSOR = 'java -jar tools/yuicompressor-2.4.7.jar '
CLOSURE_COMPILER = 'java -jar tools/compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS '
def ensure_dir(f):
d = os.path.dirname(f)
if not os.path.exists(d):
os.makedirs(d)
def getTarget(fn):
return fn.replace(HEAD_DIR, OUT_DIR)
def processHtml(fn, tg):
f = open(fn, 'r')
content = f.read()
content = REMOVE_WS(" ", content)
ensure_dir(tg)
d = open(tg, 'w+')
d.write(content)
content
def processCSS(fn, tg):
cmd = YUI_COMPRESSOR + fn + ' -o ' + tg
call(cmd, shell=True)
return
def processJS(fn, tg):
cmd = CLOSURE_COMPILER + fn + ' --js_output_file ' + tg
call(cmd, shell=True)
return
# Script starts here.
ensure_dir(OUT_DIR)
for root, dirs, files in os.walk(os.getcwd()):
for dir in dirs:
print "Processing", os.path.join(root, dir)
for file in files:
fn = os.path.join(root) + '/' + file
if fn.find(OUT_DIR) > 0:
continue
tg = getTarget(fn)
if file.endswith('.html'):
processHtml(fn, tg)
if file.endswith('.css'):
processCSS(fn, tg)
if file.endswith('.js'):
processJS(fn, tg)
gracias por señalar sacarme esto. Veo en los registros que algunos navegadores aún no son compatibles con gzip; pero mirando los registros de nuevo, las solicitudes que recibo así no son mucho. –
Quitar el 65% del HTML original probablemente no ahorrará un 65% cuando se haya comprimido, pero aún así se guardará algo. – geoffspear
Además, no olvide que a veces el html se almacena en Memcache y definitivamente quiere comprimirlo antes –