2011-01-28 13 views
5

Estoy haciendo algunas optimizaciones y decidí comprimir mis archivos javascript usando YUI Compressor. El problema es que faltan algunas líneas de código ";" al final, ya que javascript lo permite y los desarrolladores no miran demasiado a esto.Revisa javascript por faltante ";" antes de la compresión

¿Va a haber un problema cuando se comprime el código? Si es así, ¿hay alguna forma de comprobar javascript para las líneas que faltan ";"?

+4

No estoy familiarizado con YUI Compressor, pero si cambia la semántica de javascript sintácticamente válido, se rompe ... – Jon

+1

Si elimina las líneas nuevas en JavaScript sin punto y coma, se romperá ... sin que se rompa el compresor. Además de eso, el código JavaScript IMO donde los puntos y comas no se usan correctamente está roto ... realmente deberían atornillar la compatibilidad hacia atrás y hacer cumplir punto y coma ... o al menos agregar un modo para aplicarlo (¿'uso estricto;' ya lo hace?) – ThiefMaster

+0

@ThiefMaster Me parece una pena que tanta gente crea que los puntos y comas de alguna manera reducen el número de problemas en el código o que ASI es de alguna manera difícil de "hacer las cosas bien". Puedo contar la cantidad de punto y coma en mi código en mis dedos. Una herramienta de JavaScript que no comprende JavaScript simplemente se rompe. Un programa que usa puntos y comas "porque necesitan estar allí" está igual de roto. (No estoy en contra de los codificadores que usan punto y coma en JavaScript, solo aquellos que no pueden apreciar * otros * escribiendo en un estilo sin punto y coma). –

Respuesta

9

jsLint puede verificar su código para eso. Y sí, lo más probable es que cause problemas a menos que el compresor realmente contenga un analizador de JavaScript y solucione de manera activa los puntos y comas faltantes.

+0

yup jsLint comprobará eso. También dañará tus sentimientos (primera cita jsLint.com);) – Alfred

+1

Y te lo mereces por completo si escribes un código malo. ;) – ThiefMaster

+1

@ThiefMaster Estás asumiendo falsamente que la falta de punto y coma hace que el "código de mierda". No es asi. El código de Crappy es un código de mierda: punto y coma o no (o "pasa" jsLint o no, para el caso). El buen código es un buen código: punto y coma o no. –

1

Siempre puedes usar regexp para que coincida con las nuevas líneas que no tienen una; delante de ellos, y naturalmente hacen excepciones para cosas como líneas vacías,)} etc.

Pero para ser honesto, si realmente no hace este tipo de cosas automáticamente, parece que realmente está roto \ simple mal.

+0

No es la mejor idea usar una expresión regular para este tipo de cosas (en general :-), pero puede que le interese [cómo funciona jsmin] (http : //www.crockford.com/javascript/jsmin.html). No miniaturizará correctamente todos los códigos, pero hace un trabajo justo en la mayoría de los códigos y explica las reglas (* texto de reemplazo *), así como las notas de algunas limitaciones con el enfoque. Bienvenido a SO. –

+0

Bien explicado allí. En realidad, ya lo estoy usando con uno de mis sitios Drupal, pero no he leído cómo funciona realmente. Gracias por la bienvenida! – red

3

Según this SO answer, YUI Compressor puede manejarlo.

+0

Según docs (http://developer.yahoo.com/yui/compressor/#using): conservar puntos y comas innecesarios (como justo antes de '}') Esta opción es útil cuando el código comprimido debe ejecutarse a través de JSLint (que es el caso de YUI, por ejemplo). Entonces, esto no funciona ... –

2

Hice una prueba simple en tres compresores JavaScript: Yuicompressor, Yuglify y Google Closure Compiler. En mi PC con Ubuntu 12.10, he descargado los archivos binarios de cada compresor, y luego probé este archivo en cada uno de ellos:

function dbz(){ 
    var goku = 1 
    var vegeta = 2 
    var freeza = 3 
    console.log(goku + vegeta + freeza) 
} 
dbz() 

y aquí está el resultado:

yuicompressor (2.4.7):

function dbz(){var b=1;var c=2;var a=3;console.log(b+c+a)}dbz(); 

Yuglify (0.1.2):

function dbz(){var e=1,t=2,n=3;console.log(e+t+n)}dbz(); 

Cierre del compilador (versión 20121212 revisión 238 8):

function dbz(){console.log(6)}dbz(); 

Althought este es un ejemplo muy sencillo, a continuación, todos trabajaron bien en líneas con punto y coma que faltan. Todos ellos detectaron líneas sin punto y coma al final, lo agregaron y eliminaron el salto de línea después.

Cuestiones relacionadas