Mapas de origen de JavaScript, ¿Podemos hacerlo mejor?

Rate this content
Bookmark

La revisión actual de la especificación de Mapas de origen de JavaScript tiene más de 12 años. A lo largo de este tiempo, todo el ecosistema ha evolucionado enormemente, pero por alguna razón, no hemos hecho nada para mejorar la experiencia de depuración y todavía estamos atascados en la versión 3 de la especificación. ¿Podemos hacerlo mejor?

This talk has been presented at JSNation 2023, check out the latest edition of this JavaScript Conference.

FAQ

Un mapa de origen es una herramienta que permite mapear el código fuente transpilado, empaquetado o minimizado de vuelta a su código original. Esto es útil para entender cómo se produjo el código fuente y para facilitar la depuración mostrando errores más comprensibles.

En Sentry, los mapas de origen se utilizan para la depuración post hoc, donde se analiza el código que realmente se utilizó en el momento de un error para identificar y resolver problemas específicos del código minimizado o transpilado.

Un identificador de depuración es un UUID generado a partir del hash de un mapa de origen. Se inserta tanto en el archivo minimizado como en el propio mapa de origen para asegurar que ambos correspondan y facilitar la identificación del código exacto que causó un error.

Los servidores de símbolos son servidores donde se almacenan archivos de depuración, incluidos los mapas de origen, con sus ID de depuración correspondientes. Permiten acceso rápido a estos archivos durante la depuración, facilitando la resolución de errores.

Los desafíos incluyen la falta de identidad de archivos, la resolución de nombres y rutas complicadas, y las diferencias en cómo los navegadores manejan la colocación de errores debido a la codificación de caracteres. Además, la estandarización y conformidad con las especificaciones son áreas que necesitan mejora.

Sentry utiliza identificadores de depuración para vincular de manera única los archivos minimizados y los mapas de origen, asegurando que el archivo que causó el error sea el mismo que se está analizando para la depuración.

Un error críptico es un mensaje de error que no proporciona información clara sobre su causa debido a la minimización o transpilación del código. Los mapas de origen ayudan a revertir este código a su forma original, facilitando la comprensión y corrección del error.

Kamil Ogórek
Kamil Ogórek
27 min
05 Jun, 2023

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Los mapas de origen permiten comprender el código transpilado, empaquetado o minificado. La depuración con identificadores post hoc y de depuración ayuda a identificar archivos. Los problemas con los mapas de origen incluyen colisiones de hash y nombres de funciones faltantes. Se pueden utilizar diversas técnicas para determinar la función que causó un error. Los mapas de origen pueden almacenar información adicional y se pueden realizar mejoras en la resolución de rutas y posiciones de columnas. Los puntos de código y las posiciones de tokens pueden diferir entre navegadores. Detectar mapas de origen puede ser desafiante sin un esquema JSON estandarizado.

1. Introducción a los mapas de origen

Short description:

Los mapas de origen te permiten transpilar, empaquetar o minimizar el código fuente, o más bien, comprender cómo se produjo el código fuente transpilado, empaquetado o minimizado. Una vez que tenemos los mapas de origen, necesitamos combinarlos con el archivo minimizado. Esto se puede hacer a través de un comentario al final del archivo o un encabezado de solicitud. La depuración ad hoc te permite ver el error a medida que ocurre y utilizar el código exacto que desencadenó el error.

Hola a todos. Mi nombre es Kamil Ugurek y soy un ingeniero de software senior en Sentry, donde actualmente trabajo en el equipo de procesamiento, donde una de las cosas en las que estamos trabajando es procesar mapas de origen. También soy miembro del equipo principal de TRPC y, como probablemente puedas notar, realmente, realmente me encantan los mapas de origen, lo que me lleva al título opcional de esta charla, que es por qué los mapas de origen son tan difíciles de hacer correctamente.

No entraremos en muchos detalles sobre cómo funcionan los mapas de origen. Hay muchas otras fuentes que puedes utilizar para esto. Sin embargo, necesitamos entender algunas ideas muy básicas. Los mapas de origen te permiten transpilar, empaquetar o minimizar el código fuente, o más bien, comprender cómo se produjo el código fuente transpilado, empaquetado o minimizado. Lo que hace es mapear los tokens del código minimizado de vuelta al código original, lo cual te permite ver errores más utilizables, en lugar de algo como undefined X no es la función funcional, o algo por el estilo. Si quieres entender más a fondo cómo se codifica en realidad, hay una excelente publicación de blog de un amigo mío, Arpad, en su blog. Realmente te animo a que lo leas detenidamente.

Una vez que tenemos los mapas de origen, necesitamos combinarlos de alguna manera con el archivo original, o más bien, lo siento, el archivo minimizado. Una de las formas de hacer esto es a través del comentario al final del archivo con un pragma especial, que es source mapping URL, o el encabezado de solicitud, que adjuntas a la solicitud HTTP saliente. Ahora que tienes ambas cosas, en lugar de ver este mensaje de error muy críptico puedes ver algo mucho más utilizable, como fetch user data en lugar de ver una función X. Puedes ver esto directamente en tus DevTools, lo cual se llama depuración ad hoc, lo que significa que ves el error a medida que ocurre y puedes utilizar el código exacto, que se carga dentro del motor de JavaScript, y puedes estar seguro de que es el mismo código que desencadenó el error.

2. Depuración con Post Hoc y Identificadores de Depuración

Short description:

Existe otra forma de depuración llamada depuración post hoc. El principal problema es la falta de identidad, ya que no podemos determinar qué archivo se utilizó. El uso de una versión como identificador único ayuda, pero no es suficiente. Podemos utilizar identificadores de depuración, que son hashes únicos basados en los mapas de origen, para asegurarnos de que los archivos sean los mismos.

Sin embargo, existe otra forma de depuración, que es la depuración post hoc, que es lo que Sentry está haciendo en realidad, lo que significa que cuando ocurre un error, se nos envía y ahora necesitamos averiguar qué código se utilizó realmente cuando se produjo el error, que acaba de suceder después del hecho.

Esto me lleva a los problemas que existen en este momento. El primero y el más grande es la falta de identidad, lo que significa que no podemos saber qué archivo se utilizó realmente. Incluso si lo subes a nosotros, lo cual describiré muy brevemente cómo funciona. Produces algunos archivos, tienes archivos minimizados, tienes mapas correspondientes. Los pasas a través de una de las herramientas que proporcionamos, que es el binario de la CLI o los complementos para tus empaquetadores. Si quieres, puedes usar solo una llamada a la API y almacenarlos en Sentry. Necesitas usar la versión, que es un identificador único para tu compilación. Y necesitamos esto porque es la única forma en que realmente podemos tener algún tipo de identidad del archivo. Porque aparte del nombre de archivo, no hay nada más que lo haga realmente especial.

Con el tiempo, puedes tener 10 archivos MinJS empaquetados cargados para la misma versión, y no podemos saber cuál es cuál, básicamente. Es por eso que tenemos algo que también se llama un disco, que puedes pensar como directorios o el contenedor de archivos. Entonces podemos tener los mismos nombres de archivo para múltiples entornos, como producción o desarrollo o preparación. Sin embargo, aún no es suficiente, porque básicamente puedes tener el mismo nombre de archivo, algo como MinJS empaquetado, que es muy, muy común, pero producido en momentos completamente diferentes, como hoy y un mes de antelación, seis meses después, y así sucesivamente, y esos nombres pueden seguir siendo los mismos. Puedes usar nombres de hash, pero esto no siempre es posible porque a algunas personas les gusta encargarse de la memoria caché utilizando encabezados HTTP, y a veces es molesto lidiar con eso.

Entonces digamos que tenemos todos los archivos. Ahora ocurre el error. Aquí está el error. El primer marco apunta a HTTPS DRPC.IO. Assets MinJS empaquetado, que es esta línea, y realmente no nos importa el nombre del host. Podemos omitirlo para la parte de procesamiento, lo que nos deja con MinJS empaquetado. Sin embargo, la parte problemática es que se ha servido desde algún lugar. El MinJS empaquetado se encuentra dentro de Assets. Sin embargo, ¿qué sucede si la estructura de tu proyecto, cuando lo cargaste, era algo como esto, lo que significa que si solo incluiste el directorio dist para cargarlo, significa que tu archivo se encontrará en dist front-end MinJS empaquetado. Este no es el mismo camino y no coincidirán, lo que significa que no podemos decir que este archivo que acabas de servir, que en realidad causó el error, es el mismo archivo exacto que se cargó. Sería solo una suposición.

Entonces, ¿cuál es la solución a esto? ¿Cómo podemos asegurarnos de que esos archivos sean los mismos archivos, verdad? En realidad, podemos usar algo que se llama identificadores de depuración, que en el mundo nativo, es muy, muy común. Tienes algo que se llama archivos de depuración y en nuestro caso lo llamamos ID de depuración porque es muy fácil de recordar. Cómo funciona es de manera muy similar a la URL de asignación de origen, sin embargo, en lugar de usar rutas, hasheas todo el mapa de origen producido y utilizas este hash o más bien el identificador único basado en el hash, que es UUID en este caso, y lo insertas dentro del archivo minimizado y dentro del propio mapa de origen. Debes hashear el mapa de origen en lugar de solo el origen en sí porque hay una forma en que el código fuente original puede producir los mismos hashes para diferentes contenidos.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Depuración Web Moderna
JSNation 2023JSNation 2023
29 min
Depuración Web Moderna
Top Content
This Talk discusses modern web debugging and the latest updates in Chrome DevTools. It highlights new features that help pinpoint issues quicker, improved file visibility and source mapping, and ignoring and configuring files. The Breakpoints panel in DevTools has been redesigned for easier access and management. The Talk also covers the challenges of debugging with source maps and the efforts to standardize the source map format. Lastly, it provides tips for improving productivity with DevTools and emphasizes the importance of reporting bugs and using source maps for debugging production code.
El Futuro de las Herramientas de Rendimiento
JSNation 2022JSNation 2022
21 min
El Futuro de las Herramientas de Rendimiento
Top Content
Today's Talk discusses the future of performance tooling, focusing on user-centric, actionable, and contextual approaches. The introduction highlights Adi Osmani's expertise in performance tools and his passion for DevTools features. The Talk explores the integration of user flows into DevTools and Lighthouse, enabling performance measurement and optimization. It also showcases the import/export feature for user flows and the collaboration potential with Lighthouse. The Talk further delves into the use of flows with other tools like web page test and Cypress, offering cross-browser testing capabilities. The actionable aspect emphasizes the importance of metrics like Interaction to Next Paint and Total Blocking Time, as well as the improvements in Lighthouse and performance debugging tools. Lastly, the Talk emphasizes the iterative nature of performance improvement and the user-centric, actionable, and contextual future of performance tooling.
Depuración de JS
React Summit 2023React Summit 2023
24 min
Depuración de JS
Top Content
Debugging JavaScript is a crucial skill that is often overlooked in the industry. It is important to understand the problem, reproduce the issue, and identify the root cause. Having a variety of debugging tools and techniques, such as console methods and graphical debuggers, is beneficial. Replay is a time-traveling debugger for JavaScript that allows users to record and inspect bugs. It works with Redux, plain React, and even minified code with the help of source maps.
De la Fricción al Flujo: Depuración con Chrome DevTools
JSNation 2024JSNation 2024
32 min
De la Fricción al Flujo: Depuración con Chrome DevTools
The Talk discusses the importance of removing frictions in the debugging process and being aware of the tools available in Chrome DevTools. It highlights the use of the 'Emulate a Focus Page' feature for debugging disappearing elements and the improvement of debugging tools and workflow. The Talk also mentions enhancing error understanding, improving debugging efficiency and performance, and the continuous improvement of DevTools. It emphasizes the importance of staying updated with new features and providing feedback to request new features.
Rome, ¡una cadena de herramientas moderna!
JSNation 2023JSNation 2023
31 min
Rome, ¡una cadena de herramientas moderna!
Top Content
Rome is a toolchain built in Rust that aims to replace multiple tools and provide high-quality diagnostics for code maintenance. It simplifies tool interactions by performing all operations once, generating a shared structure for all tools. Rome offers a customizable format experience with a stable formatter and a linter with over 150 rules. It integrates with VCS and VLSP, supports error-resilient parsing, and has exciting plans for the future, including the ability to create JavaScript plugins. Rome aims to be a top-notch toolchain and welcomes community input to improve its work.
Depuración con Chrome DevTools
JSNation Live 2021JSNation Live 2021
11 min
Depuración con Chrome DevTools
Here are some tips for better utilizing DevTools, including using the run command, customizing keyboard shortcuts, and emulating the focus effect. Learn how to inspect memory, use the network panel for more control over network requests, and take advantage of console utilities. Save frequently used code as snippets and use local overrides for easy editing. Optimize images by using a more optimized format like AVIF and track changes in the network panel to see the reduced data size.

Workshops on related topic

Masterclass de Depuración de Rendimiento de React
React Summit 2023React Summit 2023
170 min
Masterclass de Depuración de Rendimiento de React
Top Content
Featured WorkshopFree
Ivan Akulov
Ivan Akulov
Los primeros intentos de Ivan en la depuración de rendimiento fueron caóticos. Vería una interacción lenta, intentaría una optimización aleatoria, vería que no ayudaba, y seguiría intentando otras optimizaciones hasta que encontraba la correcta (o se rendía).
En aquel entonces, Ivan no sabía cómo usar bien las herramientas de rendimiento. Haría una grabación en Chrome DevTools o React Profiler, la examinaría, intentaría hacer clic en cosas aleatorias, y luego la cerraría frustrado unos minutos después. Ahora, Ivan sabe exactamente dónde y qué buscar. Y en esta masterclass, Ivan te enseñará eso también.
Así es como va a funcionar. Tomaremos una aplicación lenta → la depuraremos (usando herramientas como Chrome DevTools, React Profiler, y why-did-you-render) → identificaremos el cuello de botella → y luego repetiremos, varias veces más. No hablaremos de las soluciones (en el 90% de los casos, es simplemente el viejo y regular useMemo() o memo()). Pero hablaremos de todo lo que viene antes - y aprenderemos a analizar cualquier problema de rendimiento de React, paso a paso.
(Nota: Esta masterclass es más adecuada para ingenieros que ya están familiarizados con cómo funcionan useMemo() y memo() - pero quieren mejorar en el uso de las herramientas de rendimiento alrededor de React. Además, estaremos cubriendo el rendimiento de la interacción, no la velocidad de carga, por lo que no escucharás una palabra sobre Lighthouse 🤐)
Depuración del Rendimiento de React
React Advanced 2023React Advanced 2023
148 min
Depuración del Rendimiento de React
Workshop
Ivan Akulov
Ivan Akulov
Los primeros intentos de Ivan en la depuración de rendimiento fueron caóticos. Veía una interacción lenta, probaba una optimización aleatoria, veía que no ayudaba, y seguía probando otras optimizaciones hasta que encontraba la correcta (o se rendía).
En aquel entonces, Ivan no sabía cómo usar bien las herramientas de rendimiento. Hacía una grabación en Chrome DevTools o React Profiler, la examinaba, intentaba hacer clic en cosas al azar, y luego la cerraba frustrado unos minutos después. Ahora, Ivan sabe exactamente dónde y qué buscar. Y en esta masterclass, Ivan te enseñará eso también.
Así es como va a funcionar. Tomaremos una aplicación lenta → la depuraremos (usando herramientas como Chrome DevTools, React Profiler, y why-did-you-render) → identificaremos el cuello de botella → y luego repetiremos, varias veces más. No hablaremos de las soluciones (en el 90% de los casos, es simplemente el viejo y regular useMemo() o memo()). Pero hablaremos de todo lo que viene antes - y aprenderemos cómo analizar cualquier problema de rendimiento de React, paso a paso.
(Nota: Esta masterclass es más adecuada para ingenieros que ya están familiarizados con cómo funcionan useMemo() y memo() - pero quieren mejorar en el uso de las herramientas de rendimiento alrededor de React. Además, cubriremos el rendimiento de interacción, no la velocidad de carga, por lo que no escucharás una palabra sobre Lighthouse 🤐)
El Masterclass de Clinic.js
JSNation 2022JSNation 2022
71 min
El Masterclass de Clinic.js
Workshop
Rafael Gonzaga
Rafael Gonzaga
Aprende las formas de la suite de herramientas clinic, que te ayudan a detectar problemas de rendimiento en tus aplicaciones Node.js. Este masterclass te guiará a través de varios ejemplos y te proporcionará los conocimientos necesarios para hacer pruebas de rendimiento y solucionar problemas de E/S y del bucle de eventos.
Soluciona el 100% de tus errores: Cómo encontrar problemas más rápido con la Reproducción de Sesiones
JSNation 2023JSNation 2023
44 min
Soluciona el 100% de tus errores: Cómo encontrar problemas más rápido con la Reproducción de Sesiones
WorkshopFree
Ryan Albrecht
Ryan Albrecht
¿Conoces ese molesto error? ¿El que no aparece localmente? Y no importa cuántas veces intentes recrear el entorno, no puedes reproducirlo. Has revisado las migas de pan, leído la traza de pila y ahora estás jugando al detective para unir los tickets de soporte y asegurarte de que sea real.
Únete al desarrollador de Sentry, Ryan Albrecht, en esta charla para aprender cómo los desarrolladores pueden utilizar la Reproducción de Sesiones, una herramienta que proporciona reproducciones de video de las interacciones de los usuarios, para identificar, reproducir y resolver errores y problemas de rendimiento más rápido (sin golpear tu cabeza contra el teclado).
Depuración en vivo de pruebas de extremo a extremo para una aplicación serverless distribuida
TestJS Summit 2021TestJS Summit 2021
146 min
Depuración en vivo de pruebas de extremo a extremo para una aplicación serverless distribuida
WorkshopFree
Serkan Ozal
Oguzhan Ozdemir
2 authors
En este masterclass, construiremos un entorno de pruebas para una aplicación preconstruida, luego escribiremos y automatizaremos pruebas de extremo a extremo para nuestra aplicación serverless. Y en el último paso, demostraremos lo fácil que es entender la causa raíz de una prueba errónea utilizando pruebas distribuidas y cómo depurarla en nuestro pipeline de CI/CD con Thundra Foresight.

Tabla de contenidos:
- Cómo configurar y probar tu infraestructura en la nube
- Cómo escribir y automatizar pruebas de extremo a extremo para tus cargas de trabajo serverless
- Cómo depurar, rastrear y solucionar problemas de fallas en las pruebas con Thundra Foresight en tus pipelines de CI/CD