2012-02-27 10 views
5

¿Qué sucede con los comentarios en un archivo minificado JavaScript? ¿Cómo puede saber el navegador cuándo termina el comentario cuando todo está condensado en una línea? Tome este pequeño ejemplo, tengo Google código de seguimiento de la siguiente manera:¿Qué sucede con los comentarios en JavaScript miniaturizado?

//Google tracking 
var _gaq = _gaq || []; 
_gaq.push(['_setAccount', '123456']); 

La versión miniaturizada tira todo en una sola línea de

// Google tracking var _gaq = _gaq || []; _gaq.push(['_setAccount', '123456']); 

Hay más declaraciones, pero cuando examino el código JavaScript en un editor , parece un comentario gigante (más o menos). ¿Hay un personaje oculto que le dice al navegador cuándo finalizar un comentario o este código simplemente no se está ejecutando?

+2

¿Qué minador estás usando? Se supone que un minificador elimina la mayor cantidad de caracteres posible, * especialmente * cosas como comentarios. (Además de los espacios en su caso.) – pimvdb

+0

¿Qué está usando para minimizar el script? – JaredPar

+2

Depende del minificador, pero supongo que un buen minificador excluiría los comentarios por completo. – jondavidjohn

Respuesta

3

Los minificadores eliminan los comentarios o insertan saltos de línea. Por ejemplo, Closure Compiler's FAQ dice:

¿Puedo utilizar el compilador de cierre junto con otros minifiers de JavaScript?

Sí. El Compilador de Cierre lee en cualquier JavaScript válido y genera JavaScript válido, por lo que puede aplicar el Compilador de Cierre a un archivo JavaScript antes o después de ejecutar el archivo a través de un minificador diferente.

Recuerde que el Compilador de cierre y otros minificadores pueden tener expectativas sobre el código entrante. Un minificador que elimina comentarios puede eliminar licencias o información de anotación que necesita otra herramienta, por ejemplo.

A veces realmente necesita un comentario en cuyo caso ponen un salto de línea.

Tengo avisos de derechos de autor o texto de licencia de fuente abierta que debe aparecer en mi código fuente. ¿Cómo evito que el compilador de cierres elimine este texto?

Closure Compiler admite la etiqueta JSDoc @license. Agregue la etiqueta @license a cualquier comentario de JSDoc para conservar el comentario en el resultado del compilador. Vea anotar JavaScript para el compilador de cierre para más información.

Los minificadores también tienden a romper líneas de vez en cuando, debido a que los analizadores de código fuente de algunos intérpretes se bloquearon o funcionaron muy lentamente en líneas realmente largas.

https://bugzilla.mozilla.org/show_bug.cgi?id=634444

Anteriormente, ya que se trataba de trozos, había un límite a la cantidad de una línea de un mensaje de error podría incluir. Pero ahora el mensaje de error contiene toda la línea. Si tiene líneas muy largas y muchos errores, es una receta para el uso de memoria alta, especialmente porque llamamos al js_DeflateString() en la cadena del mensaje de error, lo que da como resultado dos copias (una hecha de jschar s, la otra hecha de char s).

En el sitio en cuestión, montones de errores se produjeron en una línea que contiene 122,895 caracteres, lo que resulta en más de 1G de char s (a los 3 bytes por char!) Está poniendo en mensajes de error.

3

Los comentarios de una línea de JavaScript terminan en el primer carácter de nueva línea alcanzado. Un minificador eliminará los comentarios antes de eliminar las nuevas líneas para que no rompa tu código.

Por ejemplo, si pega

//GOOGLE TRACKING 
var _gaq = _gaq || []; 
_gaq.push(['_setAccount', '123456']); 

en Closure Compiler con optimizaciones simples que presentamos lo

var _gaq=_gaq||[];_gaq.push(["_setAccount","123456"]); 

con optimizaciones avanzadas que se obtiene:

var a=a||[];a.push(["_setAccount","123456"]); 

Los comentarios son eliminado en ambos.

+0

Apuesto que alguien del lado del cliente trató de 'minificar' el código a mano y terminó con esto. Gracias por la ayuda. – Rondel

Cuestiones relacionadas