Porting Turborepo to Rust

Rate this content
Bookmark

A todos les encanta hablar sobre reescribir en Rust, pero las reescrituras son difíciles. Es demasiado fácil caer en el efecto del segundo sistema, retrasos en el envío y terminar perdiendo a todos tus usuarios. ¿Cómo puedes mudarte a Rust mientras sigues lanzando funciones y manteniendo felices a tus usuarios? Fácil, en lugar de reescribir, ¡porta! En esta charla, repasaremos cómo portamos Turborepo de Go a Rust usando tres estrategias diferentes: un shim de Rust que envolvía el código Go existente; un sándwich Rust-Go-Rust para portar dependencias de manera incremental; y finalmente una implementación completamente paralela en Rust. Hablaremos sobre por qué elegimos estas estrategias, cómo las implementamos y cómo las enviamos a los usuarios.

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

Nicholas Yang
Nicholas Yang
25 min
18 Nov, 2024

Comments

Sign in or register to post your comment.
Video Summary and Transcription
La charla de hoy trata sobre portar a Rust, específicamente la experiencia de portar Turbo Repo, un sistema de construcción para JavaScript, de Go a Rust. El orador discute los desafíos enfrentados durante el proceso de portación, como las discrepancias en el código de permisos de archivos y problemas con Alpine Linux. Explican el enfoque tomado, incluyendo el uso de un shim de Rust y portar dependencias individuales de Go a Rust. La charla también cubre las limitaciones y desafíos encontrados durante el proceso de portación, así como los beneficios de aprovechar el ecosistema de Rust. El orador discute las consideraciones de reescribir versus portar y la importancia del conocimiento institucional. También tocan el impacto en el rendimiento del proceso de portación y las mejoras logradas al pasar a una implementación completamente en Rust.
Available in English: Porting Turborepo to Rust

1. Introduction to Porting to Rust

Short description:

Hoy, estoy aquí para hablar sobre cómo portar a Rust. Turbo Repo es un sistema de construcción para JavaScript que coordina diferentes paquetes dentro de un monorepo, construye un gráfico de dependencias de paquetes y orquesta tareas en paralelo. Son alrededor de 70,000 líneas de Go, compiladas para x86 y ARM en Mac, Windows y Linux. Decidimos portar por razones de alineación.

♪♪ Sí, si quieren información sobre aceite de chile, literalmente he escrito tres publicaciones de blog al respecto. Pueden buscarlas. Veamos. Sí, es genial. Entonces, ¿a quién aquí le gusta escribir en Rust? Yay, a algunos de ustedes. Y debido a eso, bueno, se ha convertido en un movimiento de reescribir en Rust, y es genial. La gente ha reescrito de todo, desde compiladores hasta navegadores en Rust. Pero las reescrituras son difíciles. Vienen con muchos desafíos. Tienes que aprender esta nueva tecnología. Tienes cambios disruptivos, errores, y puedes terminar perdiendo usuarios en el proceso.

Y así que hoy, no estoy aquí para hablar sobre reescribir en Rust. En cambio, estoy aquí para hablar sobre cómo portar a Rust. Y esto puede parecer una distinción menor, pero realmente se trata de mover piezas incrementalmente sin cambios disruptivos y manteniendo el mismo comportamiento fundamental en la arquitectura. No estás tratando de reinventar la rueda aquí. Y así es como lo hicimos con Turbo Repo. Entonces, primero, ¿qué es Turbo Repo? Turbo Repo es un sistema de construcción para JavaScript. Básicamente te permite coordinar los diferentes paquetes dentro de tu monorepo, y construye un gráfico de dependencias de paquetes, y luego desde allí, orquesta las diferentes tareas que necesitan ejecutarse. Y hace esto en paralelo, y luego almacena en caché los resultados. Así que, si quieres ejecutar la misma tarea de nuevo, simplemente leerás desde la caché en lugar de ejecutarla.

Así que, en una configuración tradicional, puede verse así, donde simplemente estás ejecutando todo secuencialmente, pero con Turbo Repo, es en paralelo y, por supuesto, en caché. Así que, debajo del capó, lo que básicamente está haciendo es cargar un montón de configuraciones. Luego inicia un gráfico de dependencias de paquetes. Así que, de nuevo, es qué paquetes dependen de cuáles. Podrías tener como una biblioteca de UI que es utilizada tanto por una aplicación web como por una aplicación de documentación, y luego desde allí, inicia las dependencias de tareas. Así que, tal vez tengas una tarea de lint que depende de una tarea de construcción, y luego ejecuta estas en paralelo, almacena en caché los resultados y muestra un resumen al usuario. Y son alrededor de 70,000 líneas de Go, y está compilado para seis objetivos diferentes. Eso es x86 y ARM en Mac, Windows, Linux. Entonces, ¿por qué decidimos portar? Bueno, la primera razón es realmente sobre alineación. Verán, Go es realmente genial si estás escribiendo un servidor web ejecutándose en Linux.

2. Challenges and Starting with Rust Shim

Short description:

Go miente sobre los códigos de permisos de archivos en Windows, pero Rust lo hace bien. Rust aprovecha excelentes proyectos como Biome, SWC, NAPI y Auxy para construir mejores herramientas. Comenzamos de manera incremental, agregando funcionalidad de Rust a TurboRepo a través del Rust shim.

Asume muchas cosas de Unix. Y así, el ejemplo clásico de esto son los códigos de permisos de archivos. Go te permitirá establecer un código de permiso de archivo al estilo Unix. Pero el único problema es que, en Windows, ese concepto no existe. Y así, cuando estableces este código, Go básicamente te mentirá. Será como, sí, claro, lo establecí, y no hará nada. Y eso aparece en cada pequeño detalle.

Y así, con Rust, acierta en estos detalles. Se asegura de que, si quieres establecer un código de permiso de archivo al estilo Unix, tienes que estar ejecutando en Unix. De lo contrario, hay una API separada para Windows. Y la segunda razón es realmente sobre el ecosistema. Verás, hay muchos proyectos excelentes por ahí haciendo un gran trabajo apoyando JavaScript en Rust. Esto podría ser Biome, que es un excelente Winter y Formatter, SWC, NAPI, Auxy. Y queremos aprovechar estas plataformas para construir mejores herramientas.

Entonces, ¿cómo empezamos? Podrías imaginar un mundo donde simplemente comienzas desde cero. Construyes una línea de comandos, construyes un gráfico de paquetes, construyes un gráfico de tareas, y sí, estás en buen camino. Pero hay muchas características. Hay muchas cosas que construir. Y es importante recordar, este es un producto maduro que es utilizado por mucha gente. No puedes simplemente eliminar estas características. Y así que no tomamos ese enfoque. En cambio, decidimos seguir lanzando características y realmente hacer las cosas de manera incremental. Nuestro objetivo era realmente que el código Rust añadiera funcionalidad a TurboRepo.

Y así decidimos comenzar con una característica muy básica. Y está facilitado por lo que llamo el Rust shim. El Rust shim nos permite implementar turbo global. Turbo global te permite usar TurboRepo como un binario común y corriente. Pero dentro de tu monorepo, encontrará la versión local de TurboRepo que está instalada y la ejecutará. Puedes pensar en ello como algo similar a core pack, donde core pack te permite ejecutar un binario global de NPM, pero usará la versión especificada en tu package.json. Y la forma en que implementamos esto fue con lo que llamamos el Rust shim, que es esencialmente una capa delgada de Rust envolviendo el código Go.

QnA

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.
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.
Un Marco para Gestionar la Deuda Técnica
TechLead Conference 2023TechLead Conference 2023
35 min
Un Marco para Gestionar la Deuda Técnica
Top Content
Today's Talk discusses the importance of managing technical debt through refactoring practices, prioritization, and planning. Successful refactoring requires establishing guidelines, maintaining an inventory, and implementing a process. Celebrating success and ensuring resilience are key to building a strong refactoring culture. Visibility, support, and transparent communication are crucial for addressing technical debt effectively. The team's responsibilities, operating style, and availability should be transparent to product managers.
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.
Construyendo un Asistente AI Activado por Voz con Javascript
JSNation 2023JSNation 2023
21 min
Construyendo un Asistente AI Activado por Voz con Javascript
Top Content
This Talk discusses building a voice-activated AI assistant using web APIs and JavaScript. It covers using the Web Speech API for speech recognition and the speech synthesis API for text to speech. The speaker demonstrates how to communicate with the Open AI API and handle the response. The Talk also explores enabling speech recognition and addressing the user. The speaker concludes by mentioning the possibility of creating a product out of the project and using Tauri for native desktop-like experiences.

Workshops on related topic

Construye Aplicaciones Modernas Utilizando GraphQL y Javascript
Node Congress 2024Node Congress 2024
152 min
Construye Aplicaciones Modernas Utilizando GraphQL y Javascript
Featured Workshop
Emanuel Scirlet
Miguel Henriques
2 authors
Ven y aprende cómo puedes potenciar tus aplicaciones modernas y seguras utilizando GraphQL y Javascript. En este masterclass construiremos una API de GraphQL y demostraremos los beneficios del lenguaje de consulta para APIs y los casos de uso para los que es adecuado. Se requiere conocimiento básico de Javascript.
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
WorkshopFree
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.
Construyendo una Aplicación de Shopify con React & Node
React Summit Remote Edition 2021React Summit Remote Edition 2021
87 min
Construyendo una Aplicación de Shopify con React & Node
Top Content
WorkshopFree
Jennifer Gray
Hanna Chen
2 authors
Los comerciantes de Shopify tienen un conjunto diverso de necesidades, y los desarrolladores tienen una oportunidad única para satisfacer esas necesidades construyendo aplicaciones. Construir una aplicación puede ser un trabajo duro, pero Shopify ha creado un conjunto de herramientas y recursos para ayudarte a construir una experiencia de aplicación sin problemas lo más rápido posible. Obtén experiencia práctica construyendo una aplicación integrada de Shopify utilizando el CLI de la aplicación Shopify, Polaris y Shopify App Bridge.Te mostraremos cómo crear una aplicación que acceda a la información de una tienda de desarrollo y pueda ejecutarse en tu entorno local.
Construye una sala de chat con Appwrite y React
JSNation 2022JSNation 2022
41 min
Construye una sala de chat con Appwrite y React
WorkshopFree
Wess Cope
Wess Cope
Las API/Backends son difíciles y necesitamos websockets. Utilizarás VS Code como tu editor, Parcel.js, Chakra-ui, React, React Icons y Appwrite. Al final de este masterclass, tendrás los conocimientos para construir una aplicación en tiempo real utilizando Appwrite y sin necesidad de desarrollar una API. ¡Sigue los pasos y tendrás una increíble aplicación de chat para presumir!
Problemas difíciles de GraphQL en Shopify
GraphQL Galaxy 2021GraphQL Galaxy 2021
164 min
Problemas difíciles de GraphQL en Shopify
WorkshopFree
Rebecca Friedman
Jonathan Baker
Alex Ackerman
Théo Ben Hassen
 Greg MacWilliam
5 authors
En Shopify a gran escala, resolvemos algunos problemas bastante difíciles. En este masterclass, cinco oradores diferentes describirán algunos de los desafíos que hemos enfrentado y cómo los hemos superado.

Tabla de contenidos:
1 - El infame problema "N+1": Jonathan Baker - Vamos a hablar sobre qué es, por qué es un problema y cómo Shopify lo maneja a gran escala en varios APIs de GraphQL.
2 - Contextualizando APIs de GraphQL: Alex Ackerman - Cómo y por qué decidimos usar directivas. Compartiré qué son las directivas, qué directivas están disponibles de forma predeterminada y cómo crear directivas personalizadas.
3 - Consultas de GraphQL más rápidas para clientes móviles: Theo Ben Hassen - A medida que tu aplicación móvil crece, también lo harán tus consultas de GraphQL. En esta charla, repasaré diversas estrategias para hacer que tus consultas sean más rápidas y efectivas.
4 - Construyendo el producto del futuro hoy: Greg MacWilliam - Cómo Shopify adopta las características futuras en el código actual.
5 - Gestión efectiva de APIs grandes: Rebecca Friedman - Tenemos miles de desarrolladores en Shopify. Veamos cómo estamos asegurando la calidad y consistencia de nuestras APIs de GraphQL con tantos colaboradores.
De 0 a Autenticación en una Hora para tu Aplicación JavaScript
JSNation 2023JSNation 2023
57 min
De 0 a Autenticación en una Hora para tu Aplicación JavaScript
WorkshopFree
Asaf Shen
Asaf Shen
La autenticación sin contraseña puede parecer compleja, pero es fácil de agregar a cualquier aplicación utilizando la herramienta adecuada.
Mejoraremos una aplicación JS de pila completa (backend Node.js + frontend Vanilla JS) para autenticar usuarios con contraseñas de un solo uso (correo electrónico) y OAuth, incluyendo:
- Autenticación de usuario: Gestión de interacciones de usuario, devolución de JWT de sesión / actualización- Gestión y validación de sesiones: Almacenamiento seguro de la sesión para solicitudes posteriores del cliente, validación / actualización de sesiones
Al final del masterclass, también abordaremos otro enfoque para la autenticación de código utilizando Flujos de Descope en el frontend (flujos de arrastrar y soltar), manteniendo solo la validación de sesión en el backend. Con esto, también mostraremos lo fácil que es habilitar la biometría y otros métodos de autenticación sin contraseña.