jquery 1.9.0 y modernizr no se pueden minimizar con el marco de optimización web ASP.NET

Estamos utilizando el marco de optimización web ASP.NET con paquetes y minificación. Un paquete solo contiene jquery y modernizr. Todo esto funcionó bien con jquery 1.8.3, pero desde que actualizamos la versión 1.9.0, la combinación jquery / modernizer bundle ya no funciona.

bundles.Add(new ScriptBundle("~/st-scripts-load-first.js") .Include("~/Resources/JavaScript/jquery-1.9.0.js", "~/Resources/JavaScript/modernizr.form-placeholder.js")); 

Tenemos tanto jquery-1.9.0.js como jquery-1.9.0.min.js en el directorio. Si no hay un archivo .min, el marco de optimización generará uno automáticamente. No funciona si el archivo .min está ahí o no.
Funciona si comstackción debug = “true” y no hay minificación o agrupación.

 /* Minification failed. Returning unminified contents. (5,2-3): run-time warning JS1195: Expected expression: * (11,60-61): run-time warning JS1004: Expected ';': { (395,2-3): run-time warning JS1195: Expected expression: ) (397,21-22): run-time warning JS1004: Expected ';': { (397,4590-4591): run-time warning JS1195: Expected expression: ) (398,28-29): run-time warning JS1195: Expected expression: ) (398,84-85): run-time warning JS1002: Syntax error: } (402,44-45): run-time warning JS1195: Expected expression: ) (408,1-2): run-time warning JS1002: Syntax error: } (393,5-22): run-time warning JS1018: 'return' statement outside of function: return Modernizr; (404,5,406,16): run-time warning JS1018: 'return' statement outside of function: return !!('placeholder' in (Modernizr.input || document.createElement('input')) && 'placeholder' in (Modernizr.textarea || document.createElement('textarea')) ); */ 

Estoy seguro de que la causa de su problema es la última línea de jquery-1.9.0.min.js:

 //@ sourceMappingURL=jquery.min.map 

La versión no minada de jQuery 1.9 no contiene esto. Te explicaré por qué en un minuto.

Me he dado cuenta de que cuando jquery-1.9.0.min.js se incluye con otro archivo, y que el otro archivo sigue a jquery-1.9.0.min.js, entonces el siguiente archivo JS es, en cierto modo, corrompido

La razón es que el inicio del siguiente archivo se adjunta a la línea ” // @ ” de jQuery, lo que significa que luego se convierte en un comentario largo y extendido. En tu caso esto significó que el

 window.Modernizr=function(n,t,i){function... 

El script al inicio de Modernizr se generó a partir del proceso de agrupación como un comentario así:

 //@ sourceMappingURL=jquery.min.map window.Modernizr=function(n,t,i){function... 

Hay una discusión sobre el Bug Tracker de jQuery con respecto a esto.

Sus opciones son eliminar la última línea o envolverla en símbolos de comentarios de varias líneas:

 /* //@ sourceMappingURL=jquery.min.map */ 

Además, puedes ver que Modernizr también contiene un mapa de origen al final de su versión minificada. Y con buena razón.

La razón detrás de esto es ayudarlo a depurar un problema cuando se ha utilizado la versión mínima del código. Esta línea le dice al navegador que este archivo minificado se asigna a otro archivo que puede ayudar en la depuración. Para aprovechar esto, necesita tener ese archivo de referencia (jquery.min.map) en el servidor o descargarlo al cliente. Además, creo que Chrome es el único navegador que soporta esto actualmente; Todavía está en desarrollo en Firefox.

Esta página tiene una excelente explicación de Source Maps.

Entonces, en resumen, eliminarlo no debería causarle ningún problema a menos que desee volver a mapear a la versión original de la fuente mientras realiza la depuración en el navegador. En su caso, debido a la forma en que funciona el marco de optimización de ASP.NET, cuando debug = “True” servirá de todas formas a las versiones no minificadas, por lo que probablemente no tenga la necesidad de usar sourceMappingURL.

No pude responder a la respuesta de awj, arriba, así que simplemente la voté. Fantástica pieza de detective. Quería agregar a un comentario, que si bien el problema se solucionó en jquery 1.9.1 ahora aparece en jquery-migrate-1.1.0

Noté la referencia del archivo del mapa como solo un comentario de una sola línea al final del archivo “jquery-migrate-1.1.0.min.js”. Así que siguiendo la sugerencia de awj, hice un comentario de varias líneas.

Entonces línea 3:

 //@ sourceMappingURL=dist/jquery-migrate.min.map 

Ahora se convierte en las líneas 3, 4 y 5 de la siguiente manera:

 /* //@ sourceMappingURL=dist/jquery-migrate.min.map */ 

Una vez que volví a subir a mi ISP, volví a tener la funcionalidad completa de ajax.

Gracias de nuevo AWJ, esto ha ayudado enormemente!

Al leer las respuestas, incluso la respuesta aceptada, la solución recomendada para este problema es modificar sus scripts para que el proveedor no tenga problemas con esto. Esto no tiene sentido para mí, esto es claramente un error del bundler que no concatena diferentes scripts, específicamente el bundler tiene un problema cuando la última línea del script n es un comentario de línea normal

 // this is the last line of the n script 

y luego su siguiente script no comienza con un solo comentario de línea

 function(){ var ... 

el agrupador, se configura por defecto con un ; como un ConcatenationToken el código empaquetado termina siendo algo así:

 // this is the last line of the n script;function(){ var ... 

Seguramente la carga del script falla con un error de syntax en alguna parte.

Se ha propuesto modificar la última línea de la secuencia de comandos para que no sea un comentario en línea, hacer un comentario de varias líneas, de modo que cuando el código termina con */ el analizador esté bien con una statement de función o algo más justo después.

No me gusta modificar mis scripts, muchos son de otros autores (jquery, etc.) y no quiero modificarlos. ¿Qué sucede si tengo que actualizarlos y volveré a encontrar este error después de actualizar un sitio web? no se ejecuta con debug="true" en la configuración.

Vengo con esta solución trabajando mejor para mi.

 bundles.Add(new ScriptBundle("~/bundles/mobile") { ConcatenationToken = ";\r\n" } .Include("~/Scripts/jquery-1.11.3*", "~/Scripts/jquery-timeago*", "~/Scripts/jquery.mobile-1.4.5*", 

De esta manera forzamos al agrupador a separar siempre los scripts con un nuevo carácter de línea. Debería hacerlo de forma predeterminada cuando la última línea del script anterior es un comentario de una sola línea.

Puede haber algún problema con su copia de modernizr.form-placeholder.js.

Acabo de encontrar el mismo error al intentar cargar jquery.peity.js.

Cuando quité la biblioteca, la página cargada bien. Así que simplemente fui y tomé los js en bruto de su sitio, rehice el archivo y lo cargué sin problemas.