El Núcleo de Turbopack Explicado (Live Coding)

This ad is not shown to multipass and full ticket holders
React Advanced
React Advanced 2026
October 23 - 26, 2026
London, UK & Online
Upcoming event
React Advanced 2026
React Advanced 2026
October 23 - 26, 2026. London, UK & Online
Bookmark
Rate this content

FAQ

Tobias Koppers es un desarrollador que trabajó en Webpack durante 10 años y actualmente está trabajando en TurboPack con la empresa Universal.

TurboPack es una nueva arquitectura diseñada para mejorar el rendimiento y la eficiencia de las compilaciones incrementales en aplicaciones grandes, especialmente diseñada para manejar millones de módulos sin ralentizarse.

La principal motivación detrás de TurboPack es resolver los problemas de escalabilidad y rendimiento que se presentan en Webpack a medida que las aplicaciones crecen y se vuelven más grandes, haciendo que las compilaciones incrementales sean más lentas.

TurboPack utiliza un enfoque de memorización y un sistema de ejecución incremental que permite recalcular solo las partes afectadas de la aplicación cuando se detectan cambios, haciendo que el proceso sea más eficiente.

El sistema de memorización en TurboPack evita la repetición de tareas ya ejecutadas al almacenar resultados de funciones previamente ejecutadas, lo que reduce el tiempo de compilación y mejora la eficiencia.

TurboPack mejora las compilaciones incrementales al permitir invalidar y recalcular solo las tareas afectadas por cambios en los archivos, en lugar de recompilar todos los módulos, lo que reduce significativamente los tiempos de compilación.

Sí, TurboPack es compatible con otras herramientas de Monorepo y se puede integrar como una herramienta de línea de comandos. Además, hay planes para una integración más profunda con TurboRepo para compartir cachés entre ambos sistemas.

Tobias Koppers
Tobias Koppers
29 min
01 Jun, 2023

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Tobias Koppers introduce TurboPack y TurboEngine, abordando las limitaciones de Webpack. Demuestra live coding para mostrar la optimización de la validación de caché y la eficiencia de construcción. La charla cubre la adición de logging y memorización, la optimización de la ejecución y el seguimiento de dependencias, la implementación de invalidación y watcher, y el almacenamiento y eliminación de invalidadores. También se discute la compilación incremental, la integración con otras herramientas de monorepo, la visualización de errores y la posibilidad de un sistema de plugins para Toolpag. Por último, se menciona la comparación con el Builder de Bunn.

1. Introduction to TurboPack and TurboEngine

Short description:

Soy Tobias Koppers, el creador de TurboPack y TurboEngine. Estoy aquí para demostrar codificación en vivo en JavaScript, centrándome en el núcleo de TurboEngine. La motivación detrás de TurboPack es abordar las limitaciones de Webpack en el manejo de aplicaciones grandes y compilaciones incrementales. TurboPack introduce una nueva arquitectura para optimizar la validación de caché y mejorar la eficiencia de la compilación. Mostraré una aplicación simple que copia archivos JavaScript basados en el gráfico de dependencias, con la adición de un encabezado de derechos de autor. A través de la codificación en vivo, explicaré el proceso y demostraré cómo TurboEngine mejora las compilaciones incrementales. ¡Comencemos!

Gracias por invitarme. Estoy intentando algo nuevo. Estoy intentando hacer codificación en vivo hoy, así que espero que funcione. Así que, sí, mi nombre es Tobias Koppers y trabajé en Webpack durante 10 años y ahora, junto a Universal, trabajo en TurboPack intentando hacer algo nuevo, algo mejor y sí, estoy intentando centrarme, como he dicho, estoy intentando centrarme en un aspecto de TurboPack e intentar explicar un poco cómo funciona TurboPack o el núcleo de TurboEngine en detalle, así que estoy intentando demostrar algo con eso, así que estoy intentando realmente intentar codificar en vivo en JavaScript un poco del núcleo de TurboEngine.

Así que la motivación de eso es que en las aplicaciones de Webpack vimos que las aplicaciones crecen y crecen, más y más grandes y Webpack, la arquitectura de Webpack no está construida para eso, las compilaciones incrementales tienden a volverse más lentas y más lentas si la aplicación crece. No es un problema tan grande, pero sí, podría convertirse en un problema en unos años cuando las aplicaciones tengan millones de módulos o lo que sea y algunos problemas que aislamos fueron hacemos muchas búsquedas de caché, tenemos que calcular muchas cosas para hacer la validación de caché como verificar si los archivos siguen siendo los mismos, hacer hash de cosas y ese es el problema porque todo este sobrecarga, lo pagas por cada compilación incremental y queremos hacer algo nuevo, una nueva arquitectura para abordar este problema. Y por eso creamos como turbo engine y turbo pack y es una nueva arquitectura y puedo explicarlo un poco haciendo codificación en vivo.

Lo que quiero mostrar es una especie de pequeña aplicación que es súper simple, no un empaquetador sino algo que es similar a un empaquetador, está tomando cualquier aplicación de JavaScript y simplemente copia la aplicación siguiendo el gráfico de dependencias a otra carpeta y al hacerlo también agrega un encabezado de derechos de autor solo para demostrar algo. Con eso, comienzo con la aplicación básica escrita en JavaScript y la explico más tarde y luego intento agregar algo similar a TurboEngine para hacerlo más eficiente, para hacer posibles las compilaciones incrementales de una manera similar a como funciona en TurboPack, en Rust y con TurboEngine. Para eso preparé esta pequeña aplicación, es realmente simple, es solo un montón de Node.js Usamos Acron para obtener el gráfico de dependencias de algo, la ruta allí, los módulos.

Y repaso la aplicación un poco para que la entiendas. El proceso principal es realmente simple, obtenemos el directorio base, como el directorio fuente, tenemos un directorio de salida, y luego tenemos un archivo de entrada que es realmente este archivo que estamos viendo. Así que realmente estamos copiando su propia aplicación a otra carpeta. Y luego comenzamos a seguir el gráfico de dependencias desde ese punto de entrada y copiamos eso del nivel base al nivel de salida. Y otro, para hacerlo un poco más complicado, agrego este archivo de encabezado que básicamente es, déjame mostrarlo, es como una declaración de derechos de autor que debería agregarse a cada archivo para hacerlo un poco más interesante. Así que luego invocamos este tipo de función, copiar gráfico, que básicamente calcula la salida del archivo actual simplemente reubicándolo. Llamando a la función de copia que copia el archivo, súper simple. Y luego llama a otras dos funciones que se llaman obtener referencias que veremos más tarde, es como obtener las referencias, como todos los archivos que han sido importados de un archivo y luego recorrer eso y llamarse a sí mismo recursivamente para simplemente copiar toda la aplicación. Sí. Así que copiar también es bastante simple, leer el encabezado, leer el archivo y escribirlo en otro archivo. Nada súper complicado aquí. Obtener referencias es un poco más complicado pero sí, no es realmente que tengas que entenderlo. Es como llamar a parse para obtener un AST del módulo y como recorrer o hacer algo de magia para extraer las declaraciones de importación y devolver una lista de todos los archivos referenciados por ese tipo de archivo. Parse también es bastante simple usando llamar a Akon, que es una biblioteca de análisis de JavaScript. También leer el archivo obviamente y luego devuelve el AST. Y después de eso comienzo todo y eso debería copiar la aplicación a la nueva carpeta. Así que intentémoslo. Oh. Algunas cosas que quiero explicar. También tengo esta función de tarea que actualmente no está haciendo nada.

2. Adding Logging and Memorization

Short description:

Así que básicamente solo se está añadiendo algo de registro para que puedas ver lo que la aplicación está haciendo. Añadimos más lógica a eso más tarde. El primer paso es básicamente añadir algún tipo de sistema de memorización que es como una caché. Almacenamos la caché en algún lugar usando un mapa. Ahora deberíamos tener este tipo de memorización, es bastante simple, en realidad.

Así que básicamente solo se está añadiendo algo de registro para que puedas ver lo que la aplicación está haciendo. De lo contrario, simplemente no imprime nada, eso es bastante aburrido. Así que solo tiene registro y lo que hago es básicamente llamar a la función con registro. Lo ves pero no es nada directo, no está haciendo nada especial.

Añadimos más lógica a eso más tarde. Así que lo que terminarás viendo es toda esta aplicación ejecutándose, así que está llamando a main, llamando a copy graph, llamando a copy y llamando a todas estas funciones en tres tipos de metales. Esto es básicamente un seguimiento de pila.

Pero también ves muchos problemas con esta aplicación. Por ejemplo, estamos leyendo el encabezado un montón de veces, como aquí y aquí y aquí. Y también estamos llamando a copy graph múltiples veces. Estamos llamando a fs copy graph desde taskKey, porque está referenciado desde fs. Y estamos llamando a copy graph desde task. Así que estamos haciendo mucho trabajo duplicado que no queremos hacer trabajo duplicado porque eso es lo que queremos hacer.

El primer paso es básicamente añadir algún tipo de sistema de memorización que es como una caché. Así que si ejecutas la misma función dos veces, entonces simplemente devolvemos un resultado existente. Así que añadamos eso. Así que para añadir algo de caché, almacenamos la caché en algún lugar. Y en JavaScript, podemos simplemente usar un mapa para eso. Y lo que queremos hacer es obtener la tarea del mapa como primer paso, la función de la caché. En realidad queremos obtener la función y todos estos argumentos. Así que porque puedes llamar a la misma función con diferentes argumentos, lo cual es básicamente una tarea diferente. Y luego si tenemos una tarea, y podemos simplemente, si no tienes una tarea, podemos simplemente crear una. Lo que significa que creamos un nuevo objeto, que tiene algún resultado, que es indefinido para el y luego establecemos el resultado, que es básicamente lo que estábamos haciendo antes, así que copia eso aquí aquí. Y luego, en cualquier caso, devolvemos el resultado. Así que ahora deberíamos tener algún tipo de sistema de memorización.

Me perdí algunas cosas, así que en realidad tengo que establecer la caché, sí, así. Y hay un error, probablemente lo veas si eres un desarrollador de JavaScript, el mapa no funciona con matrices porque se almacena por identidad, así que lo que realmente necesitamos hacer es almacenarlo por un tipo de valor de eso, así que para eso preparé algo que es como un TupleMap. Que necesito importar. Copiar carga, no lo hagas mal. Y ahora deberíamos tener este tipo de memorización, es bastante simple, en realidad.

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

Vite: Repensando las Herramientas de Frontend
JSNation Live 2021JSNation Live 2021
31 min
Vite: Repensando las Herramientas de Frontend
Top Content
Vite is a next-generation build tool that leverages native ES modules for improved performance. It eliminates the need for bundling and improves hot module replacement. Vite provides an opinionated default configuration while still allowing advanced customization through plugins. It is framework agnostic and can be used for React and other applications. Vite is being adopted by Next.js and Create React App, and integration with Nuxt 3 offers significant speed improvements.
Compilador React Forget - Entendiendo React Idiomático
React Advanced 2023React Advanced 2023
33 min
Compilador React Forget - Entendiendo React Idiomático
Top Content
Joe Savona
Mofei Zhang
2 authors
The Talk discusses React Forget, a compiler built at Meta that aims to optimize client-side React development. It explores the use of memoization to improve performance and the vision of Forget to automatically determine dependencies at build time. Forget is named with an F-word pun and has the potential to optimize server builds and enable dead code elimination. The team plans to make Forget open-source and is focused on ensuring its quality before release.
Acelerando tu aplicación React con menos JavaScript
React Summit 2023React Summit 2023
32 min
Acelerando tu aplicación React con menos JavaScript
Top Content
Mishko, the creator of Angular and AngularJS, discusses the challenges of website performance and JavaScript hydration. He explains the differences between client-side and server-side rendering and introduces Quik as a solution for efficient component hydration. Mishko demonstrates examples of state management and intercommunication using Quik. He highlights the performance benefits of using Quik with React and emphasizes the importance of reducing JavaScript size for better performance. Finally, he mentions the use of QUIC in both MPA and SPA applications for improved startup performance.
SolidJS: ¿Por qué tanto Suspense?
JSNation 2023JSNation 2023
28 min
SolidJS: ¿Por qué tanto Suspense?
Top Content
Suspense is a mechanism for orchestrating asynchronous state changes in JavaScript frameworks. It ensures async consistency in UIs and helps avoid trust erosion and inconsistencies. Suspense boundaries are used to hoist data fetching and create consistency zones based on the user interface. They can handle loading states of multiple resources and control state loading in applications. Suspense can be used for transitions, providing a smoother user experience and allowing prioritization of important content.
Los Átomos de Jotai Son Simplemente Funciones
React Day Berlin 2022React Day Berlin 2022
22 min
Los Átomos de Jotai Son Simplemente Funciones
Top Content
State management in React is a highly discussed topic with many libraries and solutions. Jotai is a new library based on atoms, which represent pieces of state. Atoms in Jotai are used to define state without holding values and can be used for global, semi-global, or local states. Jotai atoms are reusable definitions that are independent from React and can be used without React in an experimental library called Jotajsx.
Tanstack Start - Un Framework de React de Full-Stack Primero del Lado del Cliente
React Summit US 2024React Summit US 2024
30 min
Tanstack Start - Un Framework de React de Full-Stack Primero del Lado del Cliente
Top Content
We surveyed thousands of developers to show that a louder audience leads to a better presentation. There has been a shift in web app development towards server-first architectures, which has improved full-stack capabilities but at the cost of complexity and divergence from the client-centric approach. Tanstec Start is a meta-framework that aims to provide the best client-side authoring experience with powerful server-side primitives. The Tansec Router supports advanced routing features, URL state management, and JSON storage. Combined with the server-side rendering capabilities of TanStack Start, it becomes even more powerful. The TanStack Router has isomorphic loaders and integrates seamlessly with TanStack Query for additional features like polling and offline support. UseSuspenseQuery allows for dynamic streaming of data during SSR. TanStack Start also offers server-side features, API routes, server functions, and middleware. The future plans include RSCs, websockets, real-time primitives, and static pre-rendering. TanStack Start is now in beta and is suitable for building React apps. It is open source.

Workshops on related topic

Uso de CodeMirror para construir un editor de JavaScript con Linting y AutoCompletado
React Day Berlin 2022React Day Berlin 2022
86 min
Uso de CodeMirror para construir un editor de JavaScript con Linting y AutoCompletado
Top Content
Workshop
Hussien Khayoon
Kahvi Patel
2 authors
Usar una biblioteca puede parecer fácil a primera vista, pero ¿cómo eliges la biblioteca correcta? ¿Cómo actualizas una existente? ¿Y cómo te abres camino a través de la documentación para encontrar lo que quieres?
En esta masterclass, discutiremos todos estos puntos finos mientras pasamos por un ejemplo general de construcción de un editor de código usando CodeMirror en React. Todo mientras compartimos algunas de las sutilezas que nuestro equipo aprendió sobre el uso de esta biblioteca y algunos problemas que encontramos.