Analizamos Brotli y Gzip, algoritmos para comprimir recursos y servirlos al navegador.
Cuando trabajamos en aplicaciones web, la transferencia de archivos entre el servidor y el navegador es uno de los puntos donde se puede ganar velocidad con pequeños ajustes. La compresión HTTP es una de esas optimizaciones que tiene un impacto directo en el tiempo de carga. Brotli y Gzip son dos de los algoritmos más comunes para este propósito. Ambos están ampliamente soportados, pero tienen diferencias en cuanto a rendimiento, tamaño final y tiempos de compresión.
Analizaremos cada uno, evaluamos cuándo conviene usar uno u otro y mostramos cómo integrarlos en distintos entornos.
Brotli y Gzip son algoritmos de compresión sin pérdida. Eso significa que los datos originales pueden ser recuperados sin alteraciones una vez descomprimidos. Ambos fueron diseñados para comprimir texto plano, como HTML, CSS y JavaScript, y son compatibles con la mayoría de los navegadores actuales.
Ambos son compatibles con HTTP/1.1 y HTTP/2, y pueden ser utilizados directamente en servidores como Nginx o Apache, así como en herramientas de build modernas (Webpack, esbuild, Vite, etc.).
Brotli logra archivos más pequeños, especialmente en niveles de compresión altos. Esto es más notable en archivos JavaScript y CSS grandes. Veamos un ejemplo a modo de demostración, aunque no es una prueba muy científica servirá para ver claramente las diferencias:
Archivo | Original | Gzip (nivel 6) | Brotli (nivel 6) |
---|---|---|---|
app.js | 250 KB | 80 KB | 70 KB |
styles.css | 120 KB | 40 KB | 33 KB |
En muchos casos, Brotli reduce entre un 10% y 20% más que Gzip.
Aquí Gzip suele ser más rápido, sobre todo en niveles de compresión medios y bajos.
En servidores con alta carga, esa diferencia puede ser relevante si la compresión se hace al vuelo (on-the-fly).
Ambos están soportados por la mayoría de los navegadores:
Como configurar los principales servidores para que sirvan contenido comprimido con Gzip o Brotli:
Para Gzip:
gzip on;gzip_types text/plain application/javascript text/css;gzip_min_length 1000;
Para Brotli (requiere módulo extra):
brotli on;brotli_comp_level 5;brotli_types text/plain application/javascript text/css;
# GzipAddOutputFilterByType DEFLATE text/html text/css application/javascript
# BrotliAddOutputFilterByType BROTLI_COMPRESS text/html text/css application/javascript
Cloudflare, Fastly y otros proxies modernos ya soportan Brotli. Si usamos alguno de estos servicios, vale la pena verificar que esté activado.
Si trabajamos con herramientas como Webpack, podemos generar archivos comprimidos en build para servirlos precomprimidos desde el servidor.
const CompressionPlugin = require('compression-webpack-plugin');
module.exports = { plugins: [ new CompressionPlugin({ algorithm: 'brotliCompress', filename: '[path][base].br', compressionOptions: { level: 11 }, test: /\.(js|css|html|svg)$/, }), new CompressionPlugin({ algorithm: 'gzip', filename: '[path][base].gz', test: /\.(js|css|html|svg)$/, }), ],};
De esta forma, el servidor puede entregar la versión más adecuada según el encabezado Accept-Encoding
del navegador.
Depende del contexto:
Brotli y Gzip son herramientas relevantes para mejorar la carga de aplicaciones web. Brotli ofrece mejor compresión, mientras que Gzip es más rápido en compresión dinámica. La decisión no tiene por qué ser excluyente; podemos configurarlos juntos y dejar que el navegador elija. Con una configuración adecuada en el servidor o en el pipeline de build, obtenemos beneficios de rendimiento.