Depuración de JavaScript usando mapas fuente de navegador cruzado

Como desarrollador de JavaScript, estoy seguro de que ya has estado cayendo en este escenario: algo va mal con la versión de producción de tu código, y depurarlo directamente desde el servidor de producción es una pesadilla simplemente porque ha sido minificado o ha sido compilado desde otro lenguaje como TypeScript o CoffeeScript.

¿Las buenas noticias? Las últimas versiones de los navegadores pueden ayudarlo a resolver este problema utilizando mapas de origen. En este tutorial, te mostraré cómo encontrar mapas de origen en todos los navegadores y aprovechar al máximo esos minutos que tienes para depurar.

Espera, ¿cuáles son los mapas de origen?

De acuerdo con el gran artículo de Introducción a JavaScript Source Maps, un mapa de origen es "una forma de asignar un archivo combinado / minimizado a un estado no compilado. Cuando creas para la producción, además de minimizar y combinar tus archivos JavaScript, generas un mapa de origen que contiene información sobre tus archivos originales.”.

Por favor, no dude en leer primero el artículo de Ryan Seddon, ya que contiene grandes detalles sobre cómo funciona un mapa de origen. Luego aprenderá que un mapa de origen usa un archivo intermedio que hace la comparación entre la versión de producción de su código y su estado de desarrollo original. El formato de este archivo se describe aquí: Mapa de origen Revisión 3 Propuesta.

Ahora para ilustrar, voy a compartir la forma en que trabajamos actualmente mientras desarrollamos nuestro marco de código abierto WebGLBabylon.js. Esta escrito en Mecanografiado. Pero los principios seguirán siendo los mismos si está usando JavaScript comprimido / minimizado u otros lenguajes como CoffeeScript..

Ahora vamos a jugar con la magia del mapa de origen directamente en los navegadores..

La página de demostración que vamos a usar

Recientemente, he estado implementando el soporte de la API de Gamepad en nuestro motor de juegos. Vamos a usar su código para este tutorial..

En este artículo, estoy usando los siguientes navegadores:

  • Internet Explorer 11, Actualización de agosto de 2014 (versión 11.0.9600.17239) o incluso mejor, la versión del canal para desarrolladores: devchannel.modern.ie que admite la API de Gamepad. Una nota al margen sobre IE: Microsoft está trabajando en un nuevo navegador, Microsoft Edge, así que asegúrese de verificar el último soporte de estándares web para él.
  • Cromo 38 canal de desarrollador (versión 38.0.2125.8 dev-m) / Ópera 23.
  • Firefox 31 o Firefox 34 todas las noches.

Vaya a esta URL: http://david.blob.core.windows.net/babylonjs/gamepad/index.html y obtendrá esta página:

Conecte un controlador de Xbox 360 o Xbox One en el puerto USB de su máquina. presione el UNA Botón para activar el gamepad y jugar con él:

Pero no te preocupes, No necesitarás un controlador de gamepad para seguir este tutorial..

Nota: El compilador de TypeScript está generando automáticamente el mapa de origen para usted. Si desea generar un mapa de origen mientras genera su versión minified de su código, recomendaría usar UglifyJS2.

Para este artículo, incluso mezclé ambos. He minimizado el JS generado por TypeScript y mantuve la asignación de origen intacta usando esta línea de comando:

uglifyjs testgamepad.js -o testgamepad.min.js --source-map testgamepad.min.js.map --in-source-map testgamepad.js.map

Cómo depurar con el código fuente original

Utilizando Internet Explorer 11

Una vez que se haya cargado la página de prueba de la GamePad, presione F12 en IE11.

Verás que la fuente HTML hace referencia a dos archivos JavaScript: babylon.gamepads.js al comienzo de la página y testgamepad.min.js al final. El primer archivo proviene de nuestro marco en GitHub, y el segundo es una muestra simple que muestra cómo consumirlo..

Presione en el Depurador botón (o Control-3), y luego presione en el icono de carpeta.

Verás que IE11 ofrece dos archivos para depurar: babylon.gamepads.ts y testgamepad.min.js.

Empecemos revisando el babylon.gamepads.ts caso. ¿Por qué IE lo muestra en lugar de que la versión .js sea ejecutada por el navegador??

Esto es gracias al mecanismo de mapa de origen. Al final de babylon.gamepads.js Archivo, puedes encontrar esta línea específica:

// # sourceMappingURL = babylon.gamepads.js.map

Abierto babylon.gamepads.js.map para entender como funciona:

"version": 3, "file": "babylon.gamepads.js", "sourceRoot": "", "sources": ["babylon.gamepads.ts"], "names": ["BABYLON", " BABYLON.Gamepads ",…]

Al leer este archivo JSON, IE11 sabe que debe asignarse "babylon.gamepads.ts" a "babylon.gamepads.js". Es por eso que ofrece directamente depurar la fuente de TypeScript en lugar de la versión compilada de JS.

Abierto babylon.gamepad.ts en la consola IE11 F12 y verás algo que quizás nunca hayas visto antes, un lenguaje TypeScript:

Puede depurarlo como está acostumbrado a depurar su código JS, incluso si se trata de la versión compilada de JavaScript que actualmente ejecuta el navegador..

Establezca un punto de interrupción en la línea 17 y presione F5 en la ventana del navegador. Podrás depurar la versión de TypeScript del constructor:

Paso a la línea 20, pase el mouse sobre esta y expandirlo para comprobar que gamepadEventSupported se establece en cierto:

Usando Chrome / Opera

Cargue la misma página: http://david.blob.core.windows.net/babylonjs/gamepad/index.html y presione F12 en cromo o Control-Shift-I en la opera.

Haga clic en el icono de configuración y asegúrese de que Habilitar mapas fuente de JavaScript La opción está habilitada. Se debe establecer por defecto:

Chrome y Opera te permiten revisar los ejecutados. babylon.gamepads.js código, pero si intenta establecer un punto de interrupción en la versión de JavaScript, no lo mostrará. En su lugar, lo establecerá en el código fuente asignado a esta versión: babylon.gamepads.ts.

Por ejemplo, intente establecer un punto de interrupción en la línea 18 del babylon.gamepads.js Archivo JavaScript y verá que se establecerá en la línea 17 de la babylon.gamepads.ts Archivo de TypeScript en su lugar:

Por supuesto, también puede establecer los puntos de interrupción apropiados directamente en la fuente de TypeScript como se ve con IE11 justo antes..

prensa F5 en la ventana del navegador que aloja nuestra página de demostración, ahora podrá depurar mi código de TypeScript. Pasa a la línea 20 y pasa el mouse sobre la this.gamepadEventSupported variable. Debe mostrar cierto:

Usando Firefox

Cargue la misma página: http://david.blob.core.windows.net/babylonjs/gamepad/index.html y presione Control-Shift-S para abrir el depurador nativo (no use F12 / Firebug, porque no admite mapas de origen).

Comprobar que el Mostrar fuentes originales La opción está marcada:

Establezca un punto de interrupción como es habitual en la línea 17 y vuelva a cargar la página para ingresar el código. Firefox no admite el mouse sobre la fuente original. Avanza hasta la línea 20 y expande la esta objeto en su lugar en el panel derecho para comprobar que gamepadEventSupported se establece en true también.

¿Qué pasa con el archivo de JavaScript minificado??

Hasta ahora, hemos estado depurando solo el babylon.gamepads.js código usando el babylon.gamepads.ts fuente. Pero ¿qué hay de esto minificado? testgamepad.min.js Archivo JavaScript?

La primera solución es pretender el código. Funciona con IE11, Chrome, Opera y Firefox..

En IE11, presione el Impresión bonita botón o presione Control-Shift-P:

En Chrome / Opera, presione el  botón:

En Firefox, presiona tambien el botón:

Esto es mucho mejor, pero aún así no es tan bueno como lo fue con el conjunto de mapas de origen. Para poder ir un paso más allá, agregamos una nueva función en la actualización de IE11 de agosto de 2014. Puede cargar un mapa de origen incluso si lo ha eliminado del archivo .js.

¿Imagina que le gustaría evitar que cualquiera pueda depurar fácilmente el código de producción de su aplicación web utilizando el mapa de origen, pero aún así desea poder hacerlo? Sólo quite el sourceMappingURL línea de su archivo .js.

Usando Internet Explorer 11, aún puede usar el mapa de origen cargando su local .mapa y código fuente asociado. Para eso, haga clic derecho en el testgamepad.min.js y presiona Elegir mapa de origen:

Descárguelos aquí: http://david.blob.core.windows.net/babylonjs/gamepad/testgamepad.zip.

Descomprima eso en su directorio preferido y navegue hasta él para elegir el derecho .mapa expediente:

Y ahora el código fuente original puede ser depurado nuevamente:

Observe que la pestaña ha cambiado de nombre a testgamepad.ts y que las primeras variables ya están escritas ya que estamos mostrando algunos TypeScript.

Genial no lo es?

Este artículo es parte de la serie web dev tech de Microsoft. Estamos muy contentos de compartir Microsoft Edge y lo nuevo Motor de renderizado EdgeHTML con usted. Obtenga máquinas virtuales gratuitas o realice pruebas a distancia en su dispositivo Mac, iOS, Android o Windows @ http://dev.modern.ie/.

Aprender JavaScript: la guía completa

Hemos creado una guía completa para ayudarlo a aprender JavaScript, ya sea que esté comenzando a trabajar como desarrollador web o si desea explorar temas más avanzados..