Minificar JavaScript

Eliminación simple de comentarios y espacios. No sustituye Terser/esbuild.

{{ t("sizeBefore") }}: {{ minifyJs.beforeSize }}
{{ t("sizeAfter") }}: {{ minifyJs.afterSize }}
{{ t("sizeReduction") }}: {{ minifyJs.reduction }}

Descripción

JavaScript es, hoy, el lenguaje más distribuido del mundo en el sentido más literal. Cada vez que un usuario abre una página web, el navegador descarga, parsea y ejecuta archivos .js que viajaron desde un servidor a cientos o miles de kilómetros de distancia. La ironía histórica es que Brendan Eich creó JavaScript en 10 días para manejar pequeñas animaciones y validaciones de formularios. Nadie imaginaba que, tres décadas después, los archivos de cientos de kilobytes serían la norma y que toda una industria de herramientas de build existiría únicamente para comprimirlos.

La minificación no es solo eliminar espacios y comentarios, aunque eso es un punto de partida válido. Las herramientas avanzadas como Terser y esbuild van mucho más lejos: renombran variables locales de nombres descriptivos como `usuarioConectado` a `a`, eliminan código muerto (funciones declaradas pero nunca llamadas), insertan funciones pequeñas en línea e incluso sustituyen `true` por `!0` y `false` por `!1` porque esos literales tienen menos caracteres. El resultado puede ser un archivo entre un 40% y un 70% más pequeño que el original, y eso antes de aplicar gzip o brotli en el servidor.

La herramienta de esta página implementa la minificación básica: elimina comentarios de línea y de bloque, suprime espacios y tabulaciones innecesarios y colapsa los saltos de línea. Es suficiente para entender el impacto de la minificación, hacer pruebas rápidas y comparar tamaños. Para builds de producción con renombrado de variables, tree shaking y code splitting, el camino es usar Vite, webpack, Rollup o esbuild integrados en el pipeline. Ninguna herramienta en línea sustituye eso, y sería ingenuo intentarlo.

Detalle técnico

Por qué el renombrado de variables reduce tanto el archivo

  • El mangling (renombrado de variables) es la técnica más poderosa de la minificación avanzada. Una variable llamada `isUserAuthenticatedAndActive` tiene 31 caracteres; renombrada a `a`, pasa a tener 1. Multiplicado por cientos de ocurrencias, el ahorro es enorme.
  • Eliminación de código muerto: las funciones declaradas pero nunca referenciadas se eliminan directamente. Terser analiza el grafo de llamadas y descarta todo lo que nunca puede alcanzarse en tiempo de ejecución.
  • Inlining de funciones pequeñas: si una función contiene únicamente un `return` con una expresión simple, el compilador puede sustituir cada llamada por el cuerpo de la función, eliminando la sobrecarga de la llamada en el bundle final.
  • El tree shaking es la eliminación de código muerto a nivel de módulo. Cuando importas solo `{ debounce }` de una biblioteca, los bundlers modernos como Rollup y esbuild descartan todo lo demás de esa biblioteca en el bundle de salida.
  • Sustituciones literales: `true` se convierte en `!0` (2 caracteres frente a 4), `false` en `!1` y `undefined` en `void 0`. Son microoptimizaciones, pero en un archivo con miles de ocurrencias marcan una diferencia medible.

La evolución de las herramientas: de JSMin a esbuild

  • JSMin (Douglas Crockford, 2003) fue el primer minificador de uso extendido. Solo eliminaba comentarios y whitespace, sin mangling ni análisis semántico. Era suficiente para la web de 2003.
  • Packer (Dean Edwards, 2004) adoptó un enfoque distinto: comprimía el JavaScript con codificación Base62 y añadía código de descompresión inline. Generaba archivos más pequeños, pero con sobrecarga de CPU en el parseo. Quedó obsoleto al mejorar los algoritmos de compresión HTTP.
  • YUI Compressor (Yahoo, 2008) introdujo el análisis semántico real con renombrado de variables locales. Fue el estado del arte durante años, aunque su base en Java lo hacía lento.
  • UglifyJS (2010) aportó velocidad y el ecosistema Node.js. Durante años fue el estándar de facto para la minificación con mangling. Terser es un fork mantenido de UglifyJS con soporte para ES2015+ y sigue siendo la opción predeterminada en webpack.
  • esbuild (Evan Wallace, 2020) reescribió el problema en Go. Es entre 10 y 100 veces más rápido que las herramientas anteriores porque procesa archivos en paralelo y evita la sobrecarga de la VM de Node.js. SWC (Rust) sigue la misma filosofía y es usado internamente por Next.js.

Guía de la herramienta

  • Qué es JavaScript Lenguaje de script de navegadores y Node; el código fuente suele tener comentarios y espacios para legibilidad.

  • Qué hace el minificador Elimina comentarios y espacio en blanco extra de forma conservadora.

  • Por qué usarlo Experimentos rápidos de tamaño. En producción conviene usar bundlers (Terser, esbuild, etc.) con tree-shaking y pruebas.

Fragmentos de Código

Qué hace este minificador básico (regex ilustrativo)
// Eliminar comentarios de línea
const sinComentariosLinea = codigo.replace(/\/\/.*$/gm, '');

// Eliminar comentarios de bloque
const sinComentariosBloque = sinComentariosLinea.replace(/\/\*[\s\S]*?\*\//g, '');

// Colapsar whitespace
const minificado = sinComentariosBloque
  .replace(/[ \t]+/g, ' ')
  .replace(/\n\s*\n/g, '\n')
  .trim();

// Resultado: archivo más pequeño, sin renombrado de variables
// Para renombrado real, usa Terser o esbuild
Minificación avanzada con Terser (API de Node.js)
import { minify } from 'terser';

const codigo = `
function calcularDescuento(precioOriginal, porcentaje) {
  const factor = porcentaje / 100;
  return precioOriginal * (1 - factor);
}
`;

const resultado = await minify(codigo, {
  compress: {
    dead_code: true,
    drop_console: true,
  },
  mangle: {
    toplevel: true, // también renombra variables de nivel superior
  },
  format: {
    comments: false,
  },
});

console.log(resultado.code);
// Salida aproximada: function n(n,c){return n*(1-c/100)}

Antes

function hello() {
  // comentário
  return 1;
}

Preguntas frecuentes

¿Para qué sirve esta herramienta?

Funciona por completo en tu navegador: sirve para validar, formatear o convertir datos en el día a día.

¿Se envían mis datos a algún servidor?

El procesamiento es local con JavaScript. No almacenamos lo que pegas en los campos de texto.

¿Puedo usarlo con datos reales en producción?

Úsalo bajo tu responsabilidad. Para secretos (contraseñas, tokens), prefiere entornos controlados y políticas internas. Recuerda de revisar los contenidos generados. Nunca confies ciegamente en cosas que ves en internet.