El mejor compresor de JavaScript [cerrado]

171

¿Cuál es el mejor compresor de JavaScript disponible? Estoy buscando una herramienta que:

  • es fácil de usar
  • tiene una alta tasa de compresión
  • Produzca resultados finales confiables (no estropea el código)
Ron Harlev
fuente
14
Alguien sabe la situación en 2011?
Dan
44
Ahora es 2012, y creo que UglifyJS y Closure son los ganadores, uso UglifyJS y generalmente supera a todo lo demás.
mkoistinen
Uso htmlcompressor.com/compressor.html para mi aplicación jQuery Mobile multipágina . Toma un archivo HTML con etiquetas <script> y comprime el HTML, JavaScript y CSS. Funciona de maravilla.
Anders
Es 2017: ¿qué es lo último ahora?
Abhinav Singi 01 de
Es 2020. Con una configuración "segura" predeterminada, UglifyJS gana marginalmente porque es más "seguro". Para usos avanzados de energía, Closure Compiler entrega el trasero de UglifyJS para sí mismo. Closure Compiler con ADVANCDED_OPTIMIZATIONS puede hacer todo tipo de trucos que lo ayudan a optimizar su flujo de trabajo y su código al mismo tiempo. Consulte stackoverflow.com/a/50355530/5601591 para ver ejemplos de la genialidad de Closure Compiler (DESCARGO DE RESPONSABILIDAD: no pude encontrar una publicación de blog adecuada en otro lugar, así que tuve que remitirlo a una publicación que escribí).
Jack Giffin

Respuestas:

149

Recientemente lancé UglifyJS , un compresor de JavaScript que está escrito en JavaScript (se ejecuta en la plataforma NodeJS Node.js , pero se puede modificar fácilmente para que se ejecute en cualquier motor de JavaScript, ya que no necesita elementos Node.jsinternos). Es mucho más rápido que YUI Compressor y Google Closure , se comprime mejor que YUI en todos los scripts en los que lo probé, y es más seguro que Closure (sabe tratar con "eval" o "with").

Además de la eliminación de espacios en blanco, UglifyJS también hace lo siguiente:

  • cambia los nombres de las variables locales (generalmente a caracteres individuales)
  • une declaraciones de var consecutivas
  • evita insertar corchetes, parens y puntos y comas innecesarios
  • optimiza los IF (elimina "else" cuando detecta que no es necesario, transforma los IF en los operadores &&, || o? /: cuando es posible, etc.).
  • se transforma foo["bar"]en foo.bardonde sea posible
  • elimina las comillas de las claves en literales de objeto, cuando sea posible
  • resuelve expresiones simples cuando esto conduce a un código más pequeño (1 + 3 * 4 ==> 13)

PD: Oh, también puede "embellecer". ;-)

mishoo
fuente
17
Usamos uglify en una aplicación de clase empresarial. Está haciendo un buen trabajo.
gyorgyabraham
¿Podría comparar con jsmin en el nodo?
Gringo Suave
Uglify recientemente eliminó las llamadas API
Gadelkareem
@mishoo Hola, me encanta tu Uglify JS2. Mi red no funciona bien en estos días ... Me gustaría usarla en Windows. Alguna solución? : o)
Hydroper
@mishoo muestro git link pero no tengo idea de cómo usarlo
Sachin Sarola
124

Revisar esta pregunta unos años después, UglifyJS , parece ser la mejor opción a partir de ahora.

Como se indica a continuación, se ejecuta en la plataforma NodeJS, pero puede modificarse fácilmente para ejecutarse en cualquier motor de JavaScript.

--- Antigua respuesta a continuación ---

Google lanzó Closure Compiler que parece estar generando los archivos más pequeños hasta ahora, como se ve aquí y aquí

Antes de eso, las diferentes opciones eran las siguientes

Básicamente, Packer hace un mejor trabajo en la compresión inicial, pero si va a comprimir los archivos antes de enviarlos por cable (que debería estar haciendo), YUI Compressor obtiene el tamaño final más pequeño.

Las pruebas se realizaron en código jQuery por cierto.

  • Biblioteca jQuery original 62.885 bytes, 19.758 bytes después de gzip
  • jQuery minimizado con JSMin 36,391 bytes, 11,541 bytes después de gzip
  • jQuery minimizado con Packer 21,557 bytes, 11,119 bytes después de gzip
  • jQuery minimizado con el compresor YUI 31,822 bytes, 10,818 bytes después de gzip

@ daniel james menciona en el comentario compresor que muestra a Packer liderando la tabla en la mejor compresión, así que supongo que mmm

Palmadita
fuente
Packer tiene una opción para 'codificar base62', y para jQuery se comprime más pequeño que yui después de gzip. Esto se debe a que jquery usa 'eval' y 'with' que evita que los compresores 'seguros' realicen ciertas compresiones, pero el empacador las ignora. No es seguro en general, pero jQuery está probado para Packer.
Daniel James
Además, intente compressorrater.thruhere.net si no me cree.
Daniel James
9
No olvide la desventaja del empacador: el tiempo de descompresión.
Nosredna
1
cuidado, el cierre de Google a veces puede ser el peor compresor (salida incluso más grande que la original): convierte caracteres no ascii en cadenas a \uxxxxliterales de forma predeterminada ... use, por ejemplo, --charset UTF-8(si está seguro de que le informa al navegador de alguna manera)
mykhal
La salida de ClosureCompiler no funciona para mí. jscompress.com funciona
codenamezero
43

El compresor YUI es el camino a seguir. Tiene una gran tasa de compresión, está bien probado y está en uso entre muchos sitios principales y, bueno, personalmente lo recomendé.

Lo he usado para mis proyectos sin un solo error de JavaScript o hipo. Y tiene buena documentación.

Nunca he usado sus capacidades de compresión CSS, pero también existen. La compresión CSS funciona igual de bien.

Nota: Aunque Dean Edwards's / packer / logra una mejor tasa de compresión que YUI Compressor, me encontré con algunos errores de JavaScript cuando lo usé.

kamens
fuente
55
Packer se ve bien en términos de tamaño de archivo, pero resulta que el tiempo empleado en desempacar normalmente supera el tiempo ganado de transferir un archivo más pequeño a través de los tubos. La mayoría de los puntos de referencia reales del navegador que he visto lo tienen más lento que los archivos sin comprimir sin procesar que se sirven con gzip en términos de tiempo de ejecución en el navegador.
Coronel Sponsz
Aquí hay un punto de referencia: ericmmartin.com/comparison-of-javascript-compression-methods
Coronel Sponsz
Aquí hay una versión en línea del compresor en caso de que no quiera lidiar con el funcionamiento de Java: refresh-sf.com/yui
Bryan Legend
Las secuencias de comandos comprimidas usando el empaquetador no necesitan ser desempaquetadas a menos que marque la opción de codificación Base62 (que no debería hacer ya que es un gzip laico; estoy seguro de que la mayoría de los servidores modernos admiten gzip). No tiene sentido descomprimir un archivo codificado en base62 ya que no queda redundancia para explotar. La versión más nueva de Packer (la versión final) no introduce errores, no tiene una sobrecarga de desempaquetado (siempre que no codifique en base62), y aún así logra la mayor compresión. También ahora hay una versión de línea de comando de packer. Sólo tienes que instalar usando NPM de la siguiente manera: npm install packer. (= D
Aadit M Shah
8

Uso ShrinkSafe del proyecto Dojo : es excepcional porque en realidad usa un intérprete de JavaScript ( Rhino ) para tratar de encontrar símbolos en el código y comprender su alcance, etc., lo que ayuda a garantizar que el código funcione cuando salga otro extremo, a diferencia de muchas herramientas de compresión que usan expresiones regulares para hacer lo mismo (que no es tan confiable).

De hecho, tengo una tarea de MSBuild en un Proyecto de implementación web en mi solución actual de Visual Studio que ejecuta un script que a su vez ejecuta todos los archivos JS de la solución a través de ShrinkSafe antes de implementar y funciona bastante bien.

EDITAR: Por cierto, "mejor" está abierto a debate, ya que los criterios para "mejor" variarán según las necesidades del proyecto. Personalmente, creo que ShrinkSafe es un buen equilibrio; Para algunas personas que piensan que el tamaño más pequeño == mejor, será insuficiente.

EDITAR: Vale la pena señalar que el compresor YUI también usa Rhino.

Jason Bunting
fuente
5

Pruebe JSMin , obtuvo C #, Java, C y otros puertos y también está disponible.

chakrit
fuente
¿Se ha movido / eliminado el puerto C #?
Greg B
4

Si usa Packer, simplemente vaya lejos a la opción 'reducir variables' y gzip el código resultante. La opción base62 es solo para si su servidor no puede enviar archivos comprimidos. Packer con 'retráctil vars' logra una mejor compresión de la YUI, pero puede introducir errores si ha omitido un punto y coma en alguna parte.

base62 es básicamente el gzip de un hombre pobre, razón por la cual el código gzipping de base62-ed le proporciona archivos más grandes que el código gzipping shrink-var-ed.

jcoglan
fuente
1

Aquí hay un script de compresor YUI ( Byuic ) que encuentra todos los js y css en una ruta y los comprime / (opcionalmente) los ofusca. Agradable de integrar en un proceso de construcción.

jimg
fuente
1

KJScompress

http://opensource.seznam.cz/KJScompress/index.html

Kjscompress / csskompress es un conjunto de dos aplicaciones (kjscompress a csscompress) para eliminar espacios en blanco no significativos y comentarios de archivos que contienen JavaScript y CSS. Ambas son aplicaciones de línea de comandos para el sistema operativo GNU / Linux.

MicTech
fuente
1

Js Crush es un buen compresor para usar después de haber minimizado.

Alex
fuente