Minification es el proceso de eliminar del código fuente todos los caracteres no esenciales: espacios, tabulaciones, saltos de línea y comentarios. La minificación reduce el tamaño de los archivos JavaScript, CSS y HTML sin cambiar la lógica de ejecución del programa. Según MDN Web Docs, la minificación puede reducir el tamaño del archivo entre un 50 y un 70 %, lo que afecta directamente la velocidad de carga de las aplicaciones y el First Contentful Paint (FCP).
Puntos clave
Minification es una transformación automática del código fuente que elimina todos los caracteres que no afectan la ejecución del programa. Los espacios, tabulaciones, saltos de línea, comentarios y paréntesis redundantes se eliminan o acortan. La minificación se aplica a JavaScript, CSS, HTML y, con menos frecuencia, a configuraciones JSON antes del despliegue en producción.
El objetivo principal de la minificación es reducir el tamaño de los archivos transmitidos por la red. Un archivo JavaScript de 300 KB después de la minificación puede ocupar entre 120 y 150 KB, lo que reduce el tiempo de carga entre 200 y 400 ms en una conexión 3G lenta. Google PageSpeed Insights y Lighthouse recomiendan directamente minificar el código: es uno de los criterios de evaluación del rendimiento y Core Web Vitals.
La minificación es una parte integral del pipeline de compilación. Después de la transpilación con TypeScript o Babel, el código pasa por Tree Shaking (eliminación de funciones no utilizadas), luego por un minificador, y solo entonces se ensambla en el bundle final. En los bundlers modernos (Webpack, Rollup, esbuild), la minificación se realiza mediante plugins en la etapa final de la compilación.
| Elemento | Ejemplo (antes) | Ejemplo (después) | Ahorro |
|---|---|---|---|
| Espacios y tabulaciones | let x = 5; | let x=5; | ~10–20% |
| Saltos de línea | \n entre líneas | todo en una línea | ~2–5% |
| Comentarios | // comment | eliminado | ~5–30% |
| Paréntesis redundantes | if ((x > 0)) | if(x>0) | ~1–3% |
Eliminación de espacios y saltos de línea es la técnica más simple y obvia. El analizador del minificador recorre el AST (Abstract Syntax Tree) y elimina todos los caracteres de espacio en blanco que no forman parte de literales de cadena. La mayoría de los minificadores además combinan operadores en una sola línea, lo que proporciona un ahorro adicional al comprimir con GZip o Brotli.
Reemplazo de nombres de variables (mangling) es una técnica más agresiva. Las variables locales y los parámetros de funciones se renombran a identificadores de una sola letra: a, b, c. Esto reduce el tamaño en un 15–30% adicional. Terser y esbuild admiten mangling con la opción de conservar ciertos nombres (por ejemplo, API pública mediante mangle.props.reserved).
Dead code elimination (DCE) elimina ramas de código que nunca se ejecutan. El minificador analiza las condiciones que siempre son falsas (if (false)) y elimina los bloques correspondientes. El análisis más avanzado se realiza en la etapa de Tree Shaking antes de la minificación, pero el DCE a nivel del minificador detecta casos locales de código muerto no detectados a nivel de módulos.
Mangling renombra variables locales y parámetros de funciones a identificadores cortos (una o dos letras). Terser realiza el mangling basado en el ámbito: las variables dentro de una misma función obtienen nombres cortos únicos que no entran en conflicto con ámbitos externos. La opción mangle.reserved permite conservar ciertos nombres, como las API públicas de bibliotecas.
Mangling no afecta variables globales, propiedades de objetos (a menos que mangle.props esté habilitado) ni nombres de clases utilizados con new. Para proteger la API pública de una biblioteca del mangling, se debe usar mangle.props.reserved con expresiones regulares: reserved: [“_prop”, /^private_/]. Sin esta configuración, el mangling puede romper una biblioteca si el código externo accede a las propiedades del objeto por nombre.
// Código fuente
function calculateTotal(price, tax) {
var result = price + (price * tax);
// Devolver la suma total
return result;
}
var total = calculateTotal(100, 0.2);
console.log(total);// Después de la minificación con Terser
function calculateTotal(a, b){return a + a * b}
var c = calculateTotal(100, .2);
console.log(c);En el segundo ejemplo, Terser eliminó comentarios, espacios y saltos de línea, renombró price a a, tax a b, result a c. El tamaño se redujo de 197 caracteres a 79 — un ahorro del 60%. Al mismo tiempo, la funcionalidad del código se conserva por completo: calculateTotal(100, 0.2) devuelve 120.
Terser es el minificador de JavaScript estándar en el ecosistema de Webpack y la mayoría de los bundlers modernos. Terser soporta sintaxis ES6+ (funciones flecha, async/await, spread), mangling con protección de API pública, source maps y ejecución en paralelo mediante el número de CPU. Desde la versión 5.16, Terser incluye optimizaciones para TypeScript: eliminación de imports de solo tipo e interfaces.
esbuild es un minificador escrito en Go, integrado en el bundler del mismo nombre. esbuild realiza la minificación de 10 a 100 veces más rápido que Terser gracias al código nativo y al procesamiento en paralelo. Sin embargo, esbuild admite menos optimizaciones: no realiza mangling con conservación de propiedades, no elimina imports de solo tipo y optimiza las expresiones de forma menos agresiva.
// webpack.config.js — configuración de TerserPlugin
const TerserPlugin = require("terser-webpack-plugin");
module.exports = {
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true,
dead_code: true,
},
mangle: {
reserved: ["React", "Component"],
},
output: {
comments: false,
},
},
parallel: true,
}),
],
},
};La configuración de TerserPlugin incluye tres bloques clave. compress gestiona la optimización de expresiones: drop_console elimina console.log, drop_debugger elimina debugger, dead_code elimina ramas inalcanzables. mangle controla el renombrado de variables con reserved para proteger nombres públicos. parallel habilita la ejecución en paralelo con el número de CPU.
// esbuild: comando CLI para minificación de JS y CSS
// esbuild app.js --bundle --minify --outfile=dist/app.min.js
// esbuild app.css --bundle --minify --outfile=dist/app.min.css
const esbuild = require("esbuild");
esbuild.build({
entryPoints: ["src/app.js", "src/styles.css"],
bundle: true,
minify: true,
sourcemap: true,
target: ["es2015"],
outdir: "dist",
}).catch(() => process.exit(1));La API de esbuild acepta una configuración en una línea. minify: true activa la minificación tanto de JS como de CSS. sourcemap: true genera mapas de código para depuración. target define el nivel mínimo de ES: esbuild transpila automáticamente el código moderno para la versión seleccionada. esbuild es especialmente eficaz para proyectos donde el tiempo de compilación es crítico: pipelines CI/CD, Hot Module Replacement y prototipos rápidos.
React Native utiliza Metro Bundler, su propio bundler que incluye minificación basada en Terser. En modo producción, Metro aplica automáticamente la minificación al bundle JavaScript de la aplicación. La configuración de minificación en Metro se define a través de metro.config.js en la sección transformer.minifierConfig. Además, se puede deshabilitar inline-require para reducir el tamaño del bundle en iOS.
WebView en aplicaciones móviles también se beneficia de la minificación. El HTML, CSS y JS cargados en WebView deben minificarse antes de ser incrustados en la aplicación o cargados desde el servidor. Para recursos locales (Assets), la minificación es especialmente importante: el tamaño del APK/IPA afecta directamente la conversión de instalaciones en las tiendas de aplicaciones.
Hermes es un motor JavaScript para React Native desarrollado por Facebook. Hermes realiza compilación Ahead-of-Time (AOT) de bytecode, lo que reduce el tiempo de inicio de la aplicación entre un 30 y un 50%. Para Hermes, la minificación del bundle JavaScript se realiza antes de la compilación a bytecode mediante Terser. Hermes soporta su propio formato HBC (Hermes Bytecode), pero la etapa de minificación JS sigue siendo necesaria.
// metro.config.js — configuración de minificación
const defaultConfig = require("metro-config/src/defaults");
module.exports = require("metro-config").mergeConfig(
defaultConfig,
{
transformer: {
minifierConfig: {
compress: {
drop_console: true,
},
mangle: {
safari10: true,
},
},
},
}
);Metro con minifierConfig.drop_console elimina todos los console.log del bundle de producción de React Native. El parámetro mangle.safari10 evita el renombrado de identificadores que rompen Safari 10 (iOS 10). Esto es especialmente importante para aplicaciones que soportan dispositivos antiguos como iPad y iPhone 5s con iOS 10/11.
Minification y compresión (gzip, brotli) son etapas de optimización diferentes. La minificación actúa a nivel del código fuente y reduce el número de caracteres antes de enviarlo al servidor. La compresión actúa a nivel del protocolo de transporte y la aplica el servidor (nginx, Apache, CDN) al transmitir el archivo al cliente. La minificación reduce el tamaño antes de la compresión, lo que produce un doble efecto: gzip comprime datos ya reducidos.
Un archivo JavaScript de 300 KB después de la minificación — 120 KB, después de gzip — 35–40 KB. Si solo se aplica gzip al archivo no minificado, el tamaño será de 55–70 KB. Minification + gzip ofrece un resultado 30–40% mejor que gzip por sí solo. Brotli (nivel 6) comprime un 15–20% adicional de forma más eficiente que gzip después de la minificación.
| Método | Nivel | Tamaño del archivo | Reducción |
|---|---|---|---|
| Archivo original | — | 300 KB | 0% |
| Después de minificación | Código | 120 KB | 60% |
| Después de gzip (sin minificación) | Transporte | 65 KB | 78% |
| Minification + gzip | Código + Transporte | 38 KB | 87% |
| Minification + Brotli | Código + Transporte | 30 KB | 90% |
Preguntas frecuentes
UglifyJS es una herramienta de minificación obsoleta que no soporta sintaxis ES6+. Terser es un fork de UglifyJS con soporte de JavaScript moderno. Todos los bundlers modernos (Webpack 5, Rollup, esbuild) usan Terser o sus propios minificadores, mientras que UglifyJS solo se utiliza en proyectos heredados.
Source maps son archivos .map separados que no se incluyen en el bundle de producción. El servidor debe entregar source maps solo a desarrolladores autorizados (mediante la cabecera Authorization). En producción, los source maps no son cargados por el navegador del usuario, por lo que no afectan al tamaño del bundle.
Riesgo de rotura existe con un mangling agresivo que transforma nombres de propiedades de objetos. Si el código accede a elementos DOM mediante data-attributes o usa cadenas JSON para nombrar campos, el mangling puede renombrar propiedades públicas. La solución es excluir mediante mangle.reserved o deshabilitar el mangling para ciertos namespaces.
La minificación CSS proporciona menos beneficio (15–25%) que la minificación JS, pero es obligatoria para cumplir con Core Web Vitals. Los minificadores CSS eliminan espacios, fusionan selectores idénticos, acortan colores hexadecimales (#ff0000 → #f00) y eliminan @keyframes no utilizados. CleanCSS y esbuild son herramientas populares para la minificación CSS.
Source maps (archivos .map) vinculan el código minificado con el original. En Chrome DevTools y Safari Web Inspector, cuando los source maps están habilitados, se muestran los archivos originales. Para un funcionamiento correcto, los source maps deben cargarse en el servidor (incluso en producción) y habilitarse a través de las herramientas de desarrollador.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también