¿¡Hay un NUEVO gestor de paquetes!? (Alternativa a Bun)
BBetter Stack
Computing/SoftwareInternet Technology
Transcript
00:00:00Este es Nub, un kit de herramientas de JavaScript todo en uno que funciona sobre Node en lugar de reemplazarlo.
00:00:04Reemplaza todas estas herramientas que usas actualmente, desde el gestor de paquetes,
00:00:08que es cinco veces más rápido que pnpm, hasta el ejecutor de TypeScript que puede reemplazar a TSX,
00:00:13e incluso un gestor de versiones de Node. Tiene las mejores características de Bun pero sobre un Node.js nativo,
00:00:17y esa es probablemente la razón por la que Nub es simplemente Bun al revés.
00:00:21Sé que a los desarrolladores de JavaScript les encanta reinventar la rueda, pero este no es el proyecto
00:00:25de cualquier persona. En realidad está hecho por Colin, el creador de Zod, quien hizo la prueba de
00:00:29concepto de tRPC e incluso trabajó en Bun. Así que vamos a profundizar y echarle un vistazo.
00:00:38Nub es un binario único en Rust y funciona con Mac, Windows y Linux. Y como mostré al principio,
00:00:44estas son solo algunas de las herramientas que puede reemplazar. Es un ejecutor de archivos, ejecutor de scripts,
00:00:47ejecutor de paquetes, gestor de paquetes y gestor de versiones de Node. Revisemos cada uno.
00:00:52En primer lugar, el ejecutor de archivos, y solo esto tiene muchísimas funciones. Admite TypeScript
00:00:56completo, no solo la eliminación de tipos como haría Node, por lo que puede reemplazar a TSX o TSNode.
00:01:02Aquí podemos ver que tengo un archivo TypeScript con enums, namespaces y propiedades de
00:01:06parámetros, algo que Node normalmente no puede ejecutar. Si simplemente ejecuto Nub y luego el
00:01:11archivo que quiero correr, se ve que funciona perfectamente, mientras que fallaría en Node.
00:01:15Si reemplazo Nub por Node aquí, vemos que aparece un error de sintaxis de TypeScript no compatible,
00:01:20ya que no acepta el namespace ni el enum. El ejecutor de archivos también reemplaza herramientas como .env,
00:01:24importando variables de entorno automáticamente. Admite archivos .env, .env local y los de entorno
00:01:29de Node, e incluso tiene expansión automática de variables. Aquí abajo podemos tener una
00:01:33variable compuesta por otras variables de entorno. Tenemos el usuario y el host de la
00:01:37base de datos. Si ejecuto este archivo con Nub, se ve que me importa esas variables de entorno
00:01:41y ha construido mi URL de health check usando los valores de las otras variables.
00:01:46También se ve que mi clave de API no coincide con la que tengo en el archivo .env.
00:01:50Eso es porque .env local siempre tendrá prioridad, y aquí tengo la clave de API
00:01:54configurada para suscribirse a Better Stack. Es algo que definitivamente deberías hacer si quieres estar
00:01:58al día con noticias de IA y desarrollo. Por favor suscríbete, de verdad ayuda. Ahora voy a ejecutar
00:02:02nub y luego src/index.tsx, y podemos ver que todo funciona aquí. Es
00:02:07mi demostración completa de Nub. En el código de ese archivo uso muchísimas funciones del ejecutor de archivos de Nub.
00:02:12Una de las primeras es que podemos importar archivos JSON, además de YAML,
00:02:15HTML e incluso archivos de texto, y también reemplaza herramientas como tsconfig-paths. Las rutas que configuré
00:02:20aquí con @config en mi tsconfig se van a resolver correctamente a través de Node.
00:02:24También admite decoradores, como service y sealed aquí. Tiene
00:02:29soporte para JSX y de hecho transpilará esto según tu configuración de tsconfig, e incluso puedes usar
00:02:34palabras clave modernas como “using” para la gestión explícita de recursos. Además de todo eso,
00:02:38ofrece soporte para muchísimas API modernas, como Web Workers, Temporal y muchas otras. Aplicará polyfills
00:02:43automáticamente en versiones de Node que no las admitan, y activa funciones experimentales
00:02:48de Node, como el soporte para localStorage. Esto es solo la punta del iceberg de todas las funciones
00:02:52que admite el ejecutor de archivos, pero también quiero mencionar que es 100 % compatible flag por flag
00:02:56con Node. Al final, como solo ejecuta Node, simplemente reenvía esos flags. Significa que si tu
00:03:01script no usa funciones incompatibles con Node, puedes cambiar Nub por Node y obtener el
00:03:06mismo resultado exacto. Todo esto se logra casi sin impacto en la velocidad.
00:03:10Debería ser lo más cercano posible a Node, y según su documentación, toma exactamente el mismo
00:03:14tiempo ejecutar un archivo con Nub que con Node. Admito que no será más rápido que Bun, ya que Bun es
00:03:19un entorno de ejecución nativo que reemplaza a Node, y Nub está construido sobre Node. Decidí hacer mi
00:03:24propio benchmark en mi Mac para ver cuál era más rápido, y al acomodar la vista
00:03:28un poco mejor, vimos que Node fue en realidad el más rápido para mí. No tuvo la misma velocidad
00:03:31que Nub; Nub se quedó un poco atrás, pero TSX fue más lento que ambos. Pasando a otra cosa que no sea el
00:03:36ejecutor de archivos, la segunda función es el gestor de versiones de Node. Se acabaron los días de necesitar NVM o
00:03:41FNM. En Nub, si tengo un archivo en mi proyecto llamado node-version, o si lo defino en .nvmrc o incluso
00:03:46en el package.json, Nub instalará automáticamente la versión requerida directamente desde Node.js.
00:03:52Actualmente este proyecto usa la última versión de Node 26. Si cambio este archivo para que diga algo
00:03:56como 24 y lo vuelvo a ejecutar con Nub, me descargará esa versión de Node automáticamente. También tiene todos los
00:04:02comandos habituales de gestión que esperabas: podemos instalar versiones de Node, listar las instaladas,
00:04:06desinstalarlas, e incluso fijar la versión, lo que escribirá el archivo de versión de Node
00:04:10por ti. Realmente es así de simple, así que pasemos a las siguientes tres funciones,
00:04:15que es donde Nub puede reemplazar a pnpm y a Bun. La primera es la tercera función, que es el
00:04:20gestor de paquetes. Promete ser cinco veces más rápido que pnpm, y yo pensaba que pnpm ya era
00:04:25superrápido. Funciona como esperas: “nub install” instala los paquetes, pero algo genial
00:04:31es que puede adoptar tus archivos lock existentes. Si usaste Bun o pnpm en un proyecto
00:04:36anterior, Nub actualizará esos archivos lock en lugar de crear uno propio. Esto hace que sea superfácil
00:04:41cambiar entre ellos si lo necesitas, y lo mismo aplica para la compatibilidad con pnpm. Cada comando
00:04:46de gestión de paquetes en Nub es idéntico a pnpm, incluidas las funciones avanzadas como los
00:04:51catálogos de monorepositorios. Usa los mismos flags, por lo que intercambiar pnpm y Nub debería funcionar directamente. Y si
00:04:57usas npm, Bun o Yarn, también detectará las opciones de configuración de esos gestores.
00:05:02En cuanto a la afirmación sobre la velocidad, las pruebas sitúan a Nub como el más rápido en instalaciones
00:05:06con caché lista, tardando 346 milisegundos en instalar 1168 paquetes. En mi equipo hice una
00:05:13prueba con 14 dependencias directas que se resolvieron en 212 paquetes únicos, y el benchmark demuestra que Nub es
00:05:19el más rápido. Nub instaló mis paquetes en 136 milisegundos, Bun quedó segundo con 239 milisegundos,
00:05:25y pnpm y npm tardaron más de un segundo, por lo que la velocidad prometida parece ser cierta en mi equipo,
00:05:30con unos tiempos realmente impresionantes. El gestor de paquetes también toma lo mejor de pnpm en lo
00:05:35referente a seguridad: requiere una antigüedad mínima de publicación de 24 horas por defecto y no ejecutará scripts de compilación
00:05:40a menos que estén aprobados, así estarás a salvo de la mayoría de ataques de la cadena de suministro. La siguiente gran parte de un gestor
00:05:45de paquetes es la ejecución real de paquetes, que es la función número 4, y lo más destacado aquí es que
00:05:49es 19 veces más rápido que npx. El comando “nub x” apunta directamente a la carpeta de binarios dentro de node_modules,
00:05:54por lo que en Rust ejecuta los binarios directamente sin crear un proceso de Node intermedio
00:05:59en el envoltorio. Esto significa que funciona con cualquier gestor de paquetes ya que va directo a
00:06:03esos node_modules. Al igual que con la mayoría de los comandos de Nub, es 100 % compatible flag por flag con
00:06:07pnpm exec, incluyendo los comandos dlx. Al ejecutar un benchmark en mi Mac, Nub fue en realidad el
00:06:12más rápido con 169 ms para ejecutar esbuild, frente a los 423 ms de pnpm, por lo que nuevamente las afirmaciones de velocidad son reales.
00:06:20La última función que necesitas en un gestor de paquetes es el ejecutor de scripts, y al parecer este
00:06:24es 24 veces más rápido que pnpm run, además de incluir hooks de ciclo de vida, variables de entorno de npm
00:06:29y reenvío de argumentos. Cuando usas npm o pnpm, estos inician programas de Node.js,
00:06:34cargando el JavaScript de cada gestor de paquetes en cada ocasión, mientras que Nub solo usa su binario en Rust
00:06:38sin procesos de inicio. Mis benchmarks locales volvieron a mostrar que “nub run” fue el más rápido,
00:06:43aunque no por el margen tan amplio que se veía en la documentación. También vale la pena señalar,
00:06:47y es la cuarta vez que lo digo en este video, que este comando es totalmente compatible flag por flag
00:06:51con pnpm, lo que significa que también admite las funciones de monorepo de pnpm. Algo que quiero destacar
00:06:56sobre estas últimas tres funciones es que Nub no reinventó la rueda. De hecho usa
00:07:00OBE internamente, que es un gestor de paquetes escrito por JDX, el creador de
00:07:04Mise. Él hizo que el gestor de paquetes fuera integrable por otras librerías, y Colin trabajó
00:07:08con él para usarlo en Nub, así que no es trabajo robado. Esas son las características principales
00:07:13de Nub, pero aún queda mucho más por explorar, como la GitHub Action
00:07:17que reemplaza directamente a la oficial de setup-node. Realmente ha sido creado para hacer que todo
00:07:21lo relativo a Node sea mucho más fácil. Pero esta es la pregunta que me sigo haciendo: ¿realmente usaría
00:07:26esto? En mi caso, la respuesta es sí en ciertos escenarios. Seré honesto, soy un usuario bastante
00:07:31asiduo a Bun y no he tenido problemas de compatibilidad en mi desarrollo. Quizás con la nueva
00:07:35versión en Rust termine migrando, pero aun así usaría pnpm para todo lo demás, y debo
00:07:40admitir que nunca me ha parecido que pnpm sea lento. También uso Mise para gestionar mi versión
00:07:44de Node, así que no me veo necesitando esa parte. Sin embargo, sí me veo usando
00:07:48el ejecutor de archivos que reemplaza a TSX. No obstante, el caso de uso definitivo que veo para mí es cuando
00:07:52uso máquinas virtuales desechables. A veces las creo rápidamente para hacer algunas
00:07:57pruebas, y si solo quiero empezar a trabajar con Node, creo que Nub es uno de los paquetes más completos
00:08:01y la forma más rápida y fácil de hacerlo. Así que es más bien mi costumbre
00:08:05lo que me impide usar Nub a diario, pero me gustaría saber qué usas tú
00:08:08como gestor de paquetes, y si le darías una oportunidad a Nub, o si estás pensando en cambiarte desde
00:08:12Bun ahora que está reescrito en Rust. Dímelo en los comentarios de abajo, o si ya están
00:08:16suscritos, y como siempre, nos vemos en el próximo video.