
Desminificar JS y CSS: depurar código minificado en producción
Traces ilegibles y maps ausentes: JS y CSS legibles en el navegador con unminify y beautify — solo formato, nombres mangled perdidos.
Cuando el JS y el CSS de producción caben en una línea ilegible
Una traza de pila que apunta a app.min.js:1:18432, o una hoja de estilos de una sola línea de 40 KB, es primero un problema de formato, no de descompilador. La minificación quitó espacios y comentarios. El mangling (Terser mangle, compresión de identificadores de cssnano si está activa) renombró símbolos. El pretty-print restaura la forma. Solo una source map restaura los nombres originales. Cuando faltan las maps y necesitas una copia local, el desminificador JavaScript en línea y el desminificador CSS en línea reindentan en el navegador. No suben el payload. No deshacen el mangling. Para el recorrido DevTools y source maps solo de JavaScript, conserva la guía para depurar JavaScript minificado. Este artículo describe el flujo de las páginas de herramientas JS y CSS.
Cuándo unminify es la opción correcta y cuándo no
La guía de depuración de JavaScript minificado es la parte en profundidad. Cubre el pretty-print de Chrome, sourceMappingURL, las maps ocultas y por qué a nunca volverá a ser getUserProfile sin una map. Este texto no repite esa visita a DevTools. Responde a otra búsqueda. Ya tienes un fragmento JS o CSS minificado (ticket, copia de CDN, archivo de tema) y quieres las páginas de FastMinify que lo formatean. Los formateadores de la familia están en el hub de herramientas unminify.
Unminify y beautify en FastMinify solo reindentan. No son descompiladores. Trata estos límites como firmes, porque coinciden con lo que hacen las herramientas (js-beautify en la pestaña, tamaño de indent y espacios o tabuladores, comprobación de sintaxis primero).
Limitaciones:
Qué funciona:
Primero las maps, luego el pretty-print, luego las páginas de herramientas
Sigue este orden. Las páginas desminificar JavaScript y desminificar CSS son el paso 3, cuando faltan las maps y necesitas una copia formateada.
1Busca una source map
En DevTools → Sources, busca archivos originales junto al bundle, un archivo .map al lado, o un comentario //# sourceMappingURL= (JS) / /*# sourceMappingURL= (CSS). Si carga una map, depura ahí y para. Ningún formateador gana a los nombres originales.
2Pretty-print en el navegador o el editor
En Chrome Sources, el control {} Pretty Print formatea el archivo in situ. En VS Code, usa Format Document sobre un .min.js o .min.css guardado. Sigue valiendo el mismo límite: los nombres siguen reducidos. Para un bug de cascada CSS, pretty-print más el panel Styles suele ganar a copiar el archivo fuera.
3Desminifica en local solo si quieres una copia en archivo
Si no hay map y necesitas código indentado en disco o en un ticket, pega el JS en el desminificador JavaScript o el CSS en el desminificador CSS. El procesamiento se queda en el navegador. El tamaño y el carácter de indent son opciones de formato, no un desofuscador.
4Navega con literales, no con nombres
Busca cadenas únicas, direcciones URL, tokens de color y mensajes de error. Sigue patrones if / return / @media. No esperes a que a vuelva a ser un identificador real.
Ejemplo:
Antes (minificado):
Después (desminificado):
Recuperas una forma legible, no el código fuente original
Pega una IIFE de una línea o un trozo de bundle Terser. El desminificador JavaScript ejecuta js-beautify en el navegador tras una comprobación de sintaxis. Obtienes wrapping e indent. No obtienes los nombres anteriores al mangle. El !0 del ejemplo es deliberado: muchos minificadores reescriben true así, y el formato no lo convierte de nuevo en true.
Antes
Después
{} de Chrome, quédate en la guía de depuración JSEl CSS comprimido suele ser una línea con selectores pegados. El desminificador CSS formatea con js-beautify: selectores en sus líneas, declaraciones indentadas, bloques @media anidados visualmente. Especificidad y cascada no cambian, solo los espacios. Si una regla «desaparece» tras formatear, ya no se aplicaba; el formato no la borró.
Antes
Después
.9 se quedan cortos; no es una herramienta «expand to longhand»Dos bucles concretos con las páginas unminify
Abre el desminificador JavaScript. Pega un solo recorte (una función, un chunk de webpack, un bookmarklet). Pulsa Desminificar. La salida queda indentada a la derecha. Cópiala al editor y busca una cadena única de la traza de pila. Todo se queda en la pestaña.
1. Copia el archivo que falla, no la página HTML
Desde DevTools → Network o Sources, guarda el archivo .js que nombra la traza. Pegar todo el documento HTML en un desminificador JS hará fallar la comprobación de sintaxis.
2. Pega en unminify-js
Deja el indent en 2 espacios salvo que el equipo use tabuladores. Si ves un error de sintaxis, el pegado está truncado o mezclado con HTML: corrige el texto pegado, la herramienta funciona como debe.
3. Busca literales y vuelve a DevTools
Encuentra el mensaje de error o la URL. Anota el flujo de control alrededor. Aplica pretty-print al archivo en vivo en Chrome si aún necesitas breakpoints: una copia formateada en disco no sustituye una pila de llamadas en pausa.
Abre el desminificador CSS. Pega la hoja comprimida (o el recorte que contiene el selector). Tras formatear, busca la clase del DOM. Compara con Computed de DevTools: el formato no cambia qué regla gana.
1. Copia la hoja de estilos, no el HTML minificado
Panel Network → la petición .css. Los bloques <style> inline también se pegan si solo contienen CSS válido.
2. Desminifica y busca la clase o el identificador
Una lista de selectores como .btn,.cta se separa en dos líneas. Es legibilidad, no un cambio de cascada.
3. Confía en el panel Styles para el resultado real
El archivo formateado dice lo que se entregó. El panel Styles dice lo que realmente se aplica (overrides, layers, !important). Usa ambos.
En ambas páginas unminify, el tamaño y el carácter de indent son los controles de formato. Minify los ignora. No hay un interruptor «restaurar nombres originales». Para el resto de la familia (HTML, JSON, XML), véase el hub de herramientas unminify.
Unminify y beautify comparten el formateador, pero responden a distintas intenciones de búsqueda
En FastMinify, desminificar JavaScript y embellecer JavaScript formatean ambos con js-beautify tras una comprobación de sintaxis. El mismo par existe para CSS: desminificar CSS y embellecer CSS en línea. La diferencia está en la intención, no en un segundo algoritmo. Las URL unminify apuntan a salida de producción comprimida. Las URL beautify apuntan a fuente que ya consideras legible, pero quieres indentar de forma uniforme. El recorrido más largo de formateadores es la guía del code beautifier.
Si el archivo ya está en disco y el equipo usa Prettier o los servicios de lenguaje JS y CSS integrados, Format Document hace el mismo trabajo. Cambia espacios, no símbolos. Usa FastMinify cuando el fragmento está en un ticket, una respuesta de CDN o una máquina sin tu perfil de editor. Ningún camino restaura los nombres reducidos.
Qué hacer después
Depura JS y CSS minificados en este orden. Empieza por las source maps si existen, pasa al pretty-print de DevTools si solo necesitas la línea que falla, y usa un desminificador en el navegador solo cuando necesitas una copia formateada y faltan las maps. Las páginas unminify y beautify de FastMinify reindentan con js-beautify; no deshacen el mangling. Para la parte en profundidad sobre Chrome y maps, conserva la guía de depuración JavaScript. Para formatear a diario código ya legible, usa las URL beautify.
¿Faltan las maps y necesitas JS o CSS indentado en local? Formatea en el navegador y vuelve después a DevTools.
Artículos relacionados

HTTP/2 y HTTP/3 cambian el trayecto de los archivos, no su peso. Mediciones de tamaño, compilación y bundling muestran lo que la minificación aún aporta.

Convierte un epoch Unix en una fecha legible y al revés, distingue segundos de milisegundos y evita las trampas de zona horaria, JWT y cambio de hora.

Lee una expresión cron campo a campo, comprueba sus próximas ejecuciones en UTC o en hora local y evita las trampas de pasos, zonas horarias y dialectos.