Bun, Deno, Node.js? Recreando un tiempo de ejecución de JavaScript desde cero

Rate this content
Bookmark

Bun, Deno y muchos otros tiempos de ejecución de JavaScript han sido populares, pero ¿sabes por qué? ¿Es tan fácil crear un tiempo de ejecución desde cero?


He estado investigando el secreto detrás del poder de Node.js y por qué están surgiendo tantos nuevos tiempos de ejecución de JavaScript. Desglosando cada componente clave utilizado en Node.js, he llegado a conclusiones interesantes que muchas personas solían decir, pero en la práctica funciona de manera un poco diferente.


En esta charla, los asistentes aprenderán los conceptos utilizados para crear un nuevo tiempo de ejecución de JavaScript. Pasarán por un ejemplo de cómo hacer un tiempo de ejecución de JavaScript siguiendo lo que hay detrás de escena en el proyecto Node.js utilizando C++. Aprenderán la relación entre V8 de Chrome y Libuv y qué hace que un tiempo de ejecución de JavaScript sea mejor que otros.

28 min
01 Jun, 2023

Video Summary and Transcription

Esta charla explora el viaje de aprender y recrear Node.js desde cero, destacando los principales componentes y experimentos involucrados. Se adentra en la implementación de funciones en V8 y setTimeout en Node.js, así como en la tubería de ejecución y el bucle de eventos. También se discute la colaboración entre diferentes tiempos de ejecución de JavaScript y la continua evolución de Node.js. El orador comparte su experiencia explorando Node.js y escribiendo un libro, y da pistas sobre futuros proyectos que involucran React Native.

Available in English

1. Introducción a Node.js y Mi Viaje de Aprendizaje

Short description:

Hola a todos. Hoy vamos a hacer algunos experimentos locos. Intenté recrear Node.js desde cero y les contaré todos los pasos. En primer lugar, todos los diapositivas, todos los enlaces, referencias e incluso un tutorial para que sigan después de esta conferencia los puse en los últimos diapositivas. Menciónenme, mencionen el evento porque así pueden impulsar nuestro trabajo aún más. Bueno, todo este discurso trata de, ¿realmente conozco Node.js? Así que comencé a investigar muchas cosas y a hacer preguntas. He estado creando una serie de videos haciendo las mismas ideas. Pero en esta charla, ya tengo un tutorial allí y hoy les mostraré algunos aspectos destacados, e incluso escribí una publicación de blog para que la lean más tarde.

Hola a todos. ¿Cómo les ha ido? ¡Yay! Intentemos de nuevo. ¿Cómo les ha ido? ¡Whoo! ¡Energía, sí! Vamos a hacer algunos experimentos locos hoy. Esto es algo que me encanta hacer, como aprender nuevas cosas, y me encanta hacerlo probándolo, ¿verdad? Así que intenté recrear Node.js desde cero y les contaré todos los pasos de cómo lo he estado haciendo. En primer lugar, todos los diapositivas, todos los enlaces, referencias e incluso un tutorial para que sigan después de esta conferencia los puse en los últimos diapositivas. Así que no solo me escuchen aquí, pruébenlo en casa porque pueden obtener muchas otras ideas geniales. Y asegúrense de tomar tantas fotos como puedan porque esto nos ayuda mucho. Menciónenme, mencionen el evento porque así pueden impulsar nuestro trabajo aún más, ¿verdad? Bueno, todo este discurso trata de, comencé a preguntarme a mí mismo, ¿realmente conozco Node.js? Así que estaba buscando, me convertí en parte del equipo de Node.js y estaba tan asustado de estar en alguna conferencia y que la gente me hiciera preguntas sobre cómo funcionaba Node.js detrás de escena. Y me di cuenta, bueno, no sé tanto como quisiera o tanto como pensé que sabría. Así que comencé a investigar muchas cosas y a hacer preguntas, y el departamento de chat me ha ayudado mucho a responder esas preguntas. Pero he estado creando una serie de videos haciendo las mismas ideas. Así que si les gustan los proyectos de matemáticas y ciencias, he vuelto a implementar el protocolo de WebSocket desde cero usando código binario, un montón de cosas geniales y otras, creando su cobertura de código. Pero en esta charla, ya tengo un tutorial allí y hoy les mostraré algunos aspectos destacados, e incluso escribí una publicación de blog para que la lean más tarde, porque solo son 20 minutos aquí, así que pueden seguir

2. Introducción a Node.js y Mi Viaje

Short description:

No soy un desarrollador de C++, pero tengo curiosidad y ganas de aprender. Esta investigación es propia y tuve que recurrir a Google para obtener ayuda. Un agradecimiento especial a Ben, Dino, Node.js y los creadores por su increíble trabajo. Ellos abstraen la complejidad, permitiéndonos crear aplicaciones poderosas. ¡Hagamos magia!

a lo largo. Bueno, antes de continuar, quiero dejarles saber que no soy un desarrollador de C++, ¿de acuerdo? Algunos desarrolladores de C++ en la audiencia podrían ver malas prácticas aquí, pero solo soy una persona curiosa tratando de aprender algo por el camino difícil, ¿de acuerdo? Bueno, esta es parte de mi propia investigación, por lo que no encontrarán este contenido en Internet. Así que fue realmente difícil para mí, tuve que programar algunas llamadas con personas de Google, y si decían que nunca habían hecho esto en su vida, me decían que lo intentara yo mismo. Fue una locura. Y solo un agradecimiento a Ben, Dino, Node.js y a todos los creadores de esta runtime. Hoy descubrirán lo bueno y lo loco que es su trabajo. Porque ellos están abstrayendo toda la complejidad para que podamos usar un lenguaje accesible para crear aplicaciones poderosas.

3. Componentes de Node.js y Experimentación

Short description:

Intenté encontrar proyectos en GitHub, pero solo hacían V8 y nunca usaban todos los componentes. Quería experimentar y fui al sitio web de Node.js, pero no fue suficiente. Encontré la primera versión de Node.js en GitHub y me di cuenta de que era solo una prueba de concepto. Ahora hablemos de los componentes principales: JS, V8, C++ y libuv. El bucle de eventos es la magia en libuv, y el puente de C++ conecta todo. Si tenemos un archivo JS con solo 'print', no funcionará.

¡Y hagamos un poco de magia, me encanta este juego! Bien, recreando Node.js. Lo primero que hice fue tratar de encontrar proyectos en GitHub que lo estuvieran haciendo, pero solo estaban haciendo V8, solo una parte, y nunca estaban usando todos los componentes. Así que traté de averiguar cómo podía crear todos los componentes usando lo mismo. Así que fui al sitio web de Node.js, allí puedes ver cómo funcionan los bucles de eventos, cómo funciona Node.js, pero para mí no fue suficiente, era mucha teoría, pero yo quería experimentar. Quería ensuciarme las manos y empezar a trabajar en ello. Bueno, la mejor parte, ¿verdad? Tenemos todo en GitHub. Así que si vas allí, verás la primera versión de Node.js. ¿Alguien ha visto esta imagen antes, esta página web? Es una locura, ¿verdad? Y mira, Node.js no estaba usando console.log, estaba usando puts como Ruby on Rails y solo mucha explicación, ¿verdad? Bueno, fui a este repositorio, al repositorio oficial de Node.js, pero en la versión V001 y empecé a navegar por todos los archivos y empecé a darme cuenta de cómo Ryan Dahl pensaba y a hacer algunas suposiciones, ¿verdad? Tratando de descubrir algunas ideas de hace algunos años. Y algo que notarás, a veces vemos a las personas como nuestros héroes, ¿verdad? Pero si ves la historia de los commits, oh, primero compilar, nada funciona. Tres puntos, ¿qué más? Página web, muy incompleta. Tratando de implementar algo, sin éxito. No estoy seguro de ti, pero yo no suelo hacer commits de todo, pero mira, Node.js era solo una prueba de concepto. No era algo que él se diera cuenta de que era tan grande. Bueno, voy a empezar a hablar de los componentes principales y voy a tratar de ser breve en esto porque sé que hay mucha teoría en Internet, pero vamos a ver cómo funciona esto en la práctica. Así que usamos JS. JS es el lenguaje principal, ¿verdad? Pero al final, te darás cuenta de que es solo una cadena. Usamos V8 como el motor, ¿verdad? Para interpretar JavaScript y tenemos C++ como puente, como cómo podemos enlazar las respuestas de JavaScript o del sistema operativo y luego responder a esas preguntas. Y tenemos libuv para conectar eventos, crear funciones sincrónicas, y más. Oh Dios mío, veo muchas caras de error 404, pero veamos en la práctica. Bueno, imaginemos que queremos implementar dos funciones, el print como el console log que funciona actualmente en Node.js y setTimeout. Así que cuando construyes V8, V8 es la gramática. Es cuando ejecutamos const, cuando tenemos tipos de datos de función, map y más. Libuv, solo quiero que te enfoques en el bucle de eventos. El bucle de eventos aquí es como un while true, preguntando por eventos. Si hay algún evento de pintura, los va a despachar a todos. Pero la magia está en el puente de C++. El puente de C++ aquí conecta todos los puntos y hace la magia. Si miras el V8 aquí, verás que no hay proceso, no hay setTimeout aquí en esta imagen, y mucho más. De acuerdo, imaginemos que tenemos un archivo JS y solo tiene print, ¿verdad? Si intentamos ejecutar esto, print no existe en JavaScript. Tendremos algo indefinido. No es una función.

4. Implementando Funciones en V8

Short description:

Cuando compilas V8 desde cero, la lista global de JavaScript está vacía. Podemos extender V8 en el lado de C++ e implementar funciones usando anotaciones de V8. Esto nos permite llamar a funciones de C++ desde JavaScript.

Y cuando compilas V8 desde cero, verás que la lista global de JavaScript está vacía, así que no tenemos ese montón de objetos que normalmente tenemos. Bueno, intentemos implementar esta función de impresión. Primero, la implementaremos en el lado de C++, ¿de acuerdo?, usando algunas anotaciones de V8, y vamos a extender V8. Ese es el punto principal de V8. Podemos extenderlo y decir, cada vez que vea esta cadena o esta llamada, voy a llamar a este lado de C++, ¿de acuerdo?

5. Implementando setTimeout en Node.js

Short description:

En el lado de setTimeout, es exactamente lo mismo. Ahora tengo que crear la función en C++, y luego puedo usar uvtimerstart, solo para hacer referencia a que estamos usando libuv para crear y llamar esas funciones. Estoy inyectando una función en el estado global, ahora el disco global tiene setTimeout, y V8 ahora piensa que setTimeout siempre ha estado ahí. Es bastante impresionante cómo funciona Node.js. Si quieres crear tu propio tiempo de ejecución, debes centrarte en crear tus propias implementaciones.

Y ahí, tenemos solo una función de impresión para imprimir siempre, al final. Bueno, haciendo algo más difícil, setTimeout. En el lado de setTimeout, es exactamente lo mismo. Ahora tengo que crear la función en C++, y luego puedo usar uvtimerstart, solo para hacer referencia a que estamos usando libuv para crear y llamar esas funciones. Pero C es exactamente lo mismo. Estoy inyectando una función en el estado global, ahora el disco global tiene setTimeout, y V8 ahora piensa que setTimeout siempre ha estado ahí. Es bastante impresionante cómo Node.js está funcionando. Al final, mi reacción fue así, ¡Mamá, ven aquí! Sabes que Node.js solo está extendiendo funciones, no hay magia detrás de esto. No diría solo, porque al final hay muchas cosas sucediendo, pero si quieres crear tu tiempo de ejecución, debes centrarte en

6. Execution Pipeline and Calling console.log

Short description:

Vamos a explorar la tubería de ejecución de Node.js y cómo funciona detrás de escena. Comenzamos leyendo un archivo, compilando el código JavaScript en instancias de C++ y ejecutando el código. Luego, esperamos eventos en el bucle de eventos. Es interesante destacar que llamar a console.log depende del entorno y no es parte de JavaScript en sí mismo.

creando tus propias implementaciones. Muy bien, veamos algunas demostraciones. Aquí, voy a mostrarte la tubería de ejecución y cómo Node.js funciona detrás de escena. Entonces, primero de todo, solo tengo un archivo JavaScript aquí, y en solo el archivo JavaScript, estoy llamando a un programa, un programa en C++, pero no pienses en C++ aquí, solo estamos viendo cómo se realiza el paso a paso. Bueno, para empezar, estamos leyendo un archivo. Recuerda que te dije, JavaScript es una mentira, porque estamos leyendo una cadena y diciéndosela a V8, y V8 está haciendo toda la magia detrás de escena. No hay tal cosa como JavaScript. Así que estamos leyendo el archivo, obteniendo todo el contexto. Veamos. Y luego compilamos. Esta compilación es simplemente transformar todo el código JavaScript en instancias de C++, para que podamos llamarlo de inmediato. Es bastante bueno. Y luego podemos usar run, que es como evolucionar, simplemente ejecutarlo, simplemente ejecutar este código. Y vamos a tener nuestros resultados, y esperar eventos. Recuerda el bucle de eventos, recuerda el while true. El while true se ejecutará después de ejecutar nuestro código, ¿verdad? Porque se ejecutará en el futuro. Y solo para que sepas, solo por curiosidad, aquí estoy leyendo el archivo solo como un lado en C++, solo copiar y pegar, la forma más fácil de leer un archivo, no usando LibuV en este caso, pero vamos a ver que no es tan mágico, ¿verdad? No es tan difícil. Es difícil compilar y gestionar todo el entorno, pero es bastante genial. Aquí tuve que reunir todas las bibliotecas, así que pasé al menos un mes, Dios mío, mi trabajo se retrasó tratando de hacer esto, estaba llorando en casa, fue realmente difícil. Pero tienes que descargar V8 desde la fuente, tienes que compilar, generar un binario, y aquí vamos a copiar todas las entradas, solo el encabezado C++, solo referencias de cómo vamos a llamar a este binario. Podemos pensar en este binario como una API web, ¿verdad? Para libuvi, lo mismo, compilo todo, y cuando inicio C, no soy un desarrollador de C++, ¿verdad? Soy un desarrollador de Node.js, y conozco NodeMod. Así que NodeMod, podemos observar archivos y simplemente ejecutar otra instrucción. Así que implementé mi propio recarga en vivo aquí. Pero veamos estos comandos funcionando sin ningún script. Así que estoy usando make. Entonces make va a leer ese archivo make, reunir todos los binarios, y luego va a generar un binario para nosotros. Y recuerda, Node.js es solo un binario, ¿verdad? Node.js, cuando escribes node y el nombre del archivo, Node.js solo está leyendo el archivo, exactamente de la misma manera que estamos haciendo aquí. Así que lo ejecuto y puedo ver el hola mundo al final. Bastante sencillo por ahora. Pero, ¿qué pasa si podemos llamar a console.log? Cuando trabajamos con JavaScript, cualquier cosa que dependa del entorno, cuando tienes que llamar algo del sistema operativo, donde dependes del entorno, como un console.log, o imprimir cosas, no están en JavaScript. Mira este ejemplo, qué bonito es, ¿verdad? Si ejecuto console.log, no veo ningún error, lo cual es extraño para mí, porque console.log debería ser indefinido, ¿verdad?

7. Surprises with setTimeout and setInterval

Short description:

Pero si intento imprimir la consola, veré que hay un objeto allí. Bastante extraño. Si uso las claves del objeto, veré toda la API de la consola, todos los métodos, están allí, pero simplemente no son útiles. ¿Qué pasa si intentamos usar setTimeout? Exactamente el mismo problema. setTimeout no existe. Entonces, Node.js está inyectando un montón de cosas en V8. Si quieres tener tu propio navegador en tus entornos de ejecución, hay otros grupos de trabajo que pueden asesorarte sobre cómo implementar tus propias funciones. En ECMAScript, tenemos toda la gramática y todas las cosas sobre cómo se debe ejecutar JavaScript. Intentemos usar esta función print e inyectarla en el contexto de V8 para que podamos verla funcionando en la práctica. Podemos usar fechas, cadenas y todos los objetos complejos en JS. Las promesas son parte de JavaScript, pero solo son envoltorios para devoluciones de llamada. Bueno, intentemos implementar ahora este setTimeout.

en este caso no es indefinido, simplemente no imprime nada. Pero si intento imprimir la consola, veré que hay un objeto allí. Bastante extraño. Me preguntaba por qué. Si uso las claves del objeto, veré toda la API de la consola, todos los métodos, están allí, pero simplemente no son útiles. Creo que es solo una interfaz para que nosotros mismos la implementemos. No lo sé. Bueno, ¿qué pasa si intentamos usar setTimeout? setTimeout. No sé ustedes, pero mi mente quedó sorprendida. setTimeout, lo he estado usando desde el primer día trabajando con JavaScript. ¿Qué pasa si usamos setInterval? Exactamente el mismo problema. setInterval no existe. Así que mi mente quedó sorprendida. Mi mente pensó: `ok, entonces Node.js está inyectando un montón de cosas en V8. V8 simplemente está interpretando y vinculando todas las ideas juntas. Pero JavaScript no es el desastre que estoy mostrando. Si quieres tener tu propio navegador en tus entornos de ejecución, hay muchos otros grupos de trabajo que pueden asesorarte sobre cómo implementar tus propias funciones. Pero solo están asesorando y no hay una forma definida de cómo implementarlo. En ECMAScript, tenemos toda la gramática y todas las cosas sobre cómo se debe ejecutar JavaScript. Y si intentas ejecutar nuestro propio código aquí, vamos a ver la impresión. La función print, solo echa un vistazo a printf(). Para mí, fue, diría, algo magnífico porque recuerdo que cuando fui a la universidad, lo primero que hice fue un printf() y ahora estamos usando printf() hasta hoy en día. Pero solo para dar un poco de contexto, intentemos usar esta función print e inyectarla en el contexto de V8 para que podamos verla funcionando en la práctica, ¿de acuerdo? Tengo la función print aquí y verás que estoy usando exactamente la misma idea que te mostré en el diagrama. Simplemente extiendo V8 y digo que cualquier cosa que tengas en esta cadena llame a esta función de C++. Y luego, veamos lo demás, y luego si voy a mi código puedo ver que la impresión está funcionando como un printf, ¿verdad? Puedo usar fechas, las fechas son una excepción para el entorno, ¿verdad?, porque dependemos de las fechas. Podemos usar las cadenas y podemos usar todos los objetos complejos como mapas, operaciones de propagación, operadores, conjuntos y todo lo que está en JS. Observa aquí que las promesas no son objetos asíncronos. Oh Dios mío. Las promesas son parte de JavaScript, pero solo son envoltorios para devoluciones de llamada. Al final, vamos a ver esto en la práctica, pero es algo realmente genial.

8. Linking Elements with libuv and C++

Short description:

Para vincular ambos elementos, creamos una función utilizando libuv. Verificamos si es una función de devolución de llamada y usamos una estructura de getter en C++ para guardar las variables para futuras ejecuciones. Utilizamos uw timer, una llamada de libuv, y cuando finaliza el tiempo de espera, llamamos a la función de devolución de llamada. Aquí no hay JavaScript, solo C++. Es asombroso pensar en los elementos incrustables y otros conceptos interesantes.

para mí. Bueno, intentemos implementar ahora este setTimeout. Mi idea era, ok, necesito vincular ambos elementos, así que ahora necesitamos usar libuv. ¿Cómo podríamos hacer eso? Vamos a crear una función aquí, ¿de acuerdo? Y solo echa un vistazo aquí. Estoy obteniendo todos los argumentos, solo levanto esto en la terminal. Así que estoy usando este mismo enfoque tanto para setTimeout como para setInterval. Tengo que verificar si es una función de devolución de llamada. Y luego esta fue la parte más difícil para mí. Recuerda, cuando uso un setTimeout, esta función se ejecutará en el futuro. Entonces debería guardar las variables, el contexto, en algún lugar, ¿verdad? Aquí estoy usando una estructura de getter en C++ solo para guardar estos datos para poder ejecutarlos en el futuro. Así que aquí estoy usando uw timer solo para mostrar que es una llamada de libuv. Y luego, cuando finaliza el tiempo de espera, recibimos esta devolución de llamada con nuestra variable almacenada allí, y luego voy a llamar a la función de devolución de llamada con el resultado. ¿Ves? ¡Aquí no hay JavaScript! Es solo C++. Al final, estamos llamando de vuelta a JavaScript, pero JavaScript no es nada aquí. JavaScript es solo una abstracción para C++, Rust, u otras cosas de bajo nivel. Para mí, fue bastante, bastante asombroso, porque podemos pensar en elementos incrustables y en muchos otros conceptos interesantes también.

9. Event Loop and Extending V8

Short description:

El bucle de eventos, waitForEvents y la extensión de V8 son directos. Al compilar y ejecutar el código, el tiempo de espera está disponible en el lado de JavaScript. Se crean abstracciones para setInterval y setTimeout utilizando promesas y async await, eliminando la necesidad de devoluciones de llamada. Todo sigue la especificación ECMAScript.

Bueno, el waitForEvents, es el bucle de eventos, el whileTrue. Y mira, qué directo es esto. No necesito usar ninguna lógica aquí. Solo estoy usando el bucle de eventos predeterminado, que es una variable global, y lo ejecuto. Y luego podemos seguir la misma idea. Voy a compilar este código. Lo voy a ejecutar, mantenerlo funcionando y simplemente esperar eventos como hemos hecho antes. Y luego, la misma idea que estábamos haciendo en el ejemplo de impresión, como aquí. Solo estamos extendiendo el V8. Y cuando intentamos ejecutarlo, mira, estoy usando el tiempo de espera. El tiempo de espera ahora está disponible en el lado de JavaScript. Estoy creando dos abstracciones, una para setInterval y otra para setTimeout, pero mira qué increíble es esto. Estoy utilizando promesas para envolver esto para poder usar async await. Así que no necesito usar devoluciones de llamada, no necesito implementar nada porque async await forma parte de la especificación ECMAScript. Todo lo que está en la especificación de JavaScript, puedes verlo funcionando ahí mismo. Así que si intentamos ejecutar esto, vamos a ver

10. JavaScript Runtimes and Collaboration

Short description:

Amigos míos, no puedo describirles cómo me sentí cuando vi esos registros funcionando por primera vez. Node.js tiene una gran cantidad de métodos. Exponen algunas APIs que están en el lado de C++ y que se pueden manejar desde JavaScript. ¿Por qué ahora tenemos tantos entornos de ejecución de JavaScript apareciendo? Dino, Bun y Node.js hacen lo mismo pero manejan los datos de manera diferente. La experiencia del desarrollador es importante. No hay competencia, ya que los desarrolladores de diferentes entornos colaboran juntos. Ve al tutorial y compruébalo tú mismo.

funcionando. Amigos míos, no puedo describirles cómo me sentí cuando vi esos registros funcionando por primera vez. Estaba llamando a todos como, oh Dios mío, finalmente funcionó porque es realmente difícil. Todos estos ejemplos aquí, te darás cuenta de que estoy usando Gitpod justo en la parte inferior. Así que todos esos ejemplos, no necesitarás compilarlos por ti mismo en tu propio. Solo tienes que bifurcar mi proyecto allí y verás todos los pasos. Puedes enfocarte solo en la parte del código, así que te ahorro muchos problemas. Y si te das cuenta ahora, Node.js allí, Node.js tiene una gran cantidad de métodos. En realidad, en la V011, ¿verdad?, ellos están exponiendo los temporizadores. Entonces, cuando vas al repositorio de Node.js ahora, puedes ver que Node.js tiene una gran cantidad de lado C++ y una gran cantidad de lado JavaScript, ¿verdad? Entonces, lo que hacen, es exponer algunas APIs que están en el lado de C++ y que se pueden manejar desde JavaScript porque esto es fácil de mantener, no tienes que manejar muchos tipos de datos, y cualquier desarrollador de JavaScript podría contribuir a ello. Por eso tenemos una base de datos tan grande en Node.js también. Bueno, todo sigue las especificaciones de ECMAScript. Así que puedes ver que setTimeOut, setInterval no están ahí. Pero mi otra pregunta era, ¿por qué ahora tenemos tantos entornos de ejecución de JavaScript apareciendo ahora, ¿verdad? ¿No es eso una locura? Porque JavaScript ha estado aquí desde 2009. Pero si miras a Dino, Dino está usando TypeScript y muchos otros textos. Pero si miras el código fuente allí, está haciendo lo mismo. Está usando JavaScript para compilar a instancias de Rust y ejecutar en todos los datos. ¿Qué tal Bun? Exactamente lo mismo. Están usando el núcleo de JavaScript y haciendo todas las ideas ahí mismo. Exactamente la misma idea. Bueno, son exactamente la misma idea, pero tal vez te preguntes, ¿qué hace que uno sea mejor que otro? ¿De acuerdo? Bueno, la forma en que manejan los datos, esto es todo el sistema de archivos de Node.js, y aquí es donde uno puede ser más rápido que otro, cuando están enviando datos al sistema operativo. Tienen que manejar búferes, tienen que responder a JavaScript, y tienen que hacerlo más rápido, ¿verdad? Así es como Ben dice que es más rápido que Node.js porque está usando otro lenguaje de programación y otras experiencias geniales también. Y en mi opinión, no sé ustedes, pero la experiencia del desarrollador importa. Si tengo que abrir diez archivos diferentes solo para crear una API, será difícil para nosotros. Dino tenía, desde el principio, TestRunner, tenía TypeScript, lo cual ayudaba mucho a los desarrolladores. Pero verás que no hay tal cosa como competencia. Allí, verás que Jarrod Summer de Ben, acaba de ingresar al núcleo de Node.js. Colin Areig, ha estado trabajando en Node.js desde el principio. Ha estado trabajando en Dino, así que todos están colaborando juntos. Bueno, ve al tutorial, pruébalo tú mismo. Te sorprenderás

QnA

Continuando con Node.js y Bun

Short description:

Si quieres ver más contenido, ve a mi sitio web. Construí un libro electrónico para ti y planteé un desafío para implementar tu propio archivo rojo FS. Node.js tiene una gran comunidad y sigue evolucionando. Aún es rápido en comparación con los entornos de ejecución más nuevos. Se dice que Bun es más rápido que Node.js, pero el lenguaje de programación que eligieron es diferente: Zig.

Estoy emocionado porque sé que es mucho para asimilar, es mucho para observar. Si quieres ver más contenido, si quieres ver más de mis charlas, ve a mi sitio web. Verás un montón de cosas interesantes para aprender también allí. Y, por supuesto, construí un libro electrónico para ti, enseñando paso a paso, y también te planteé un buen desafío para que implementes tu propio archivo rojo FS. Todo bien. Antes de terminar esta charla, tomemos nuestra tradicional selfie para que podamos hacer que la gente del otro lado envidie, ¿de acuerdo? Muy bien. Voy a confiar en ti, ¿verdad? Así que voy a contar hasta tres, y hacemos wow, ¿de acuerdo? Así que uno, dos, tres. ¡Hey! Muchas gracias por haberme invitado.

Primera pregunta. Con todos estos entornos de ejecución de JavaScript que están surgiendo, ¿por qué seguirías apostando por Node.js? Bueno, diría que la comunidad ha sido genial desde el principio. Pero es interesante ver cómo Node.js ha estado evolucionando después de esos entornos de ejecución de JS. Ahora tenemos un grupo de trabajo de rendimiento que trabaja para aumentar y mejorar el rendimiento. Así que verás desde Node.js15 hasta Node.js20, es increíble lo rápido que se ha vuelto. Así que Node.js tiene una base especial para evolucionar. No diría que va a desaparecer pronto. Pero para mí, lo mejor es que sigue siendo rápido en comparación con los entornos de ejecución que acaban de aparecer y Node.js ha estado allí desde 2009. Es increíble.

Vale. Y ahora una pregunta fácil. ¿Dónde conseguiste tu camiseta? Es de otra conferencia en Brasil. No implementes los viernes, por favor. Y luego, bien, veamos. Tenemos otra pregunta sobre qué hace que Bun sea más rápido que Node si está escrito en C++ en su núcleo. Interesante. Ahora, hay algunas contradicciones, porque la gente dice que Bun es realmente más rápido que Node.js, pero eso fue antes de nuestro grupo de trabajo de rendimiento. Dijeron que ahora no es tan rápido en comparación uno con otro. Pero el lenguaje de programación que eligieron es diferente. Es Zig. ¿Alguien ha trabajado con Zig antes? Miré el código fuente y no pude entender nada. Fue, Jesucristo, es increíble. La forma en que manejan el JavaScript, dicen que JavaScript Core es más rápido que V8.

Explorando Node.js y Escribiendo un Libro

Short description:

Encontré tiempo para explorar Node.js y escribir un libro porque fue una buena oportunidad para aprender y crear contenido único. A pesar de los retrasos y desafíos, valió la pena al final. Estoy planeando trabajar en un clon de React Native, que será un proyecto complejo y emocionante.

No lo sé. Pregunté a algunas personas de V8. Ellos dijeron que no tiene mucho sentido. Pero diría que el conjunto de tecnologías y las estructuras de datos que está utilizando para consumir datos del sistema operativo de ida y vuelta. Oh, okay. Entonces estas próximas preguntas van juntas. ¿Cómo encontraste tiempo para explorar las profundidades de Node y escribir un libro al respecto? Y también, ¿por qué crees que es importante construir cosas desde cero, ir tan profundo? Algunos amigos dirían que me gusta sufrir. Pero he estado trabajando como productor de contenido, ¿verdad? Así que hago videos en YouTube. Vendo cursos premium. Así que al hacer esto, sentí que era una buena oportunidad para aprender más sobre Node.js, hacer algo por primera vez que nunca he visto en Internet. Y busqué mucho y no encontré contenido que abarque todo el proceso de trabajar con Node.js. Y no encontré tiempo para esto. Así que pasé un mes y todo se retrasó. Mi equipo se volvió loco conmigo. Pero al final dije, esto es algo mejor bueno, ¿verdad? Pude hacer algo que me encantó. Y al mismo tiempo pude hablar en conferencias porque es un título muy llamativo, ¿verdad? Así que para mí, valió la pena al final. Y solo un adelanto para ti. Probablemente ahora voy a intentar hacer el clon de React Native. Así que eso es iOS, Android y JavaScript en el medio. Sí, esto va a ser una locura. No, definitivamente tiene sentido. Bien, esta es un poco más larga. Entonces, ¿por qué las promesas funcionan de forma gratuita en V8? ¿Podrías explicar por qué no fue necesario implementarlas manualmente en tu propio runtime? Está preguntando por qué no necesitamos implementar promesas. Bueno, las promesas son parte de los módulos de ECMAScript, por lo que todo lo que ves en la especificación estará en V8, en Firefox, SpiderMonkey, ChakraCore y en todos los demás entornos de ejecución. Pero aquí, como te mostré, las promesas son solo envoltorios. No son operaciones asíncronas. Si creas un bucle while dentro de un objeto de promesa, de todos modos bloqueará tu código. Ten esto en cuenta, va a ser genial. Entendido, entendido. Y luego, ¿has intentado usar las otras tecnologías que mencionaste por ti mismo? Como otros motores en V8, C en lugar de C++? Intenté aprender Rust porque quería hacer cosas en Rust, pero no pude, era tan complicado. Pero intenté ejecutar Bund, Dino y los demás. Pero mi objetivo no era mostrar cuál es el mejor, sino mostrar cómo funcionan detrás de escena y por qué son tan importantes, y por qué ahora están apareciendo tantos entornos de ejecución de JavaScript. Tiene sentido. Y para nuestra última pregunta, ¿en qué estás trabajando ahora? Bueno, diría que el clon de React Native, probablemente. Estoy preguntando mucho a ChatzPT sobre esto. Pero es una locura, porque tengo que compilar todo el SDK de iOS, tengo que hacer el puente allí, tuve que compilar Android y hacer el puente, y poner C++ o algo en el medio para entender JavaScript. Sé que hay algunas bibliotecas, pero quería usar el bucle de eventos y todo lo que estamos usando en Node.js. Así que voy a sufrir un poco más. Perfecto. Gracias, Eric. Si tienes más preguntas para Eric, él estará en los stands que creo que están justo afuera de esta sala. Y ahora, ¿podemos dar un último aplauso? ¡Gracias!

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

TechLead Conference 2023TechLead Conference 2023
35 min
A Framework for Managing Technical Debt
Let’s face it: technical debt is inevitable and rewriting your code every 6 months is not an option. Refactoring is a complex topic that doesn't have a one-size-fits-all solution. Frontend applications are particularly sensitive because of frequent requirements and user flows changes. New abstractions, updated patterns and cleaning up those old functions - it all sounds great on paper, but it often fails in practice: todos accumulate, tickets end up rotting in the backlog and legacy code crops up in every corner of your codebase. So a process of continuous refactoring is the only weapon you have against tech debt.In the past three years, I’ve been exploring different strategies and processes for refactoring code. In this talk I will describe the key components of a framework for tackling refactoring and I will share some of the learnings accumulated along the way. Hopefully, this will help you in your quest of improving the code quality of your codebases.

React Summit 2023React Summit 2023
24 min
Debugging JS
As developers, we spend much of our time debugging apps - often code we didn't even write. Sadly, few developers have ever been taught how to approach debugging - it's something most of us learn through painful experience.  The good news is you _can_ learn how to debug effectively, and there's several key techniques and tools you can use for debugging JS and React apps.
Node Congress 2022Node Congress 2022
26 min
It's a Jungle Out There: What's Really Going on Inside Your Node_Modules Folder
Top Content
Do you know what’s really going on in your node_modules folder? Software supply chain attacks have exploded over the past 12 months and they’re only accelerating in 2022 and beyond. We’ll dive into examples of recent supply chain attacks and what concrete steps you can take to protect your team from this emerging threat.
You can check the slides for Feross' talk here.
React Advanced Conference 2022React Advanced Conference 2022
22 min
Monolith to Micro-Frontends
Top Content
Many companies worldwide are considering adopting Micro-Frontends to improve business agility and scale, however, there are many unknowns when it comes to what the migration path looks like in practice. In this talk, I will discuss the steps required to successfully migrate a monolithic React Application into a more modular decoupled frontend architecture.
React Advanced Conference 2023React Advanced Conference 2023
22 min
Power Fixing React Performance Woes
Next.js and other wrapping React frameworks provide great power in building larger applications. But with great power comes great performance responsibility - and if you don’t pay attention, it’s easy to add multiple seconds of loading penalty on all of your pages. Eek! Let’s walk through a case study of how a few hours of performance debugging improved both load and parse times for the Centered app by several hundred percent each. We’ll learn not just why those performance problems happen, but how to diagnose and fix them. Hooray, performance! ⚡️

Workshops on related topic

Node Congress 2023Node Congress 2023
109 min
Node.js Masterclass
Workshop
Have you ever struggled with designing and structuring your Node.js applications? Building applications that are well organised, testable and extendable is not always easy. It can often turn out to be a lot more complicated than you expect it to be. In this live event Matteo will show you how he builds Node.js applications from scratch. You’ll learn how he approaches application design, and the philosophies that he applies to create modular, maintainable and effective applications.

Level: intermediate
React Summit Remote Edition 2021React Summit Remote Edition 2021
87 min
Building a Shopify App with React & Node
Top Content
WorkshopFree
Shopify merchants have a diverse set of needs, and developers have a unique opportunity to meet those needs building apps. Building an app can be tough work but Shopify has created a set of tools and resources to help you build out a seamless app experience as quickly as possible. Get hands on experience building an embedded Shopify app using the Shopify App CLI, Polaris and Shopify App Bridge.We’ll show you how to create an app that accesses information from a development store and can run in your local environment.
Node Congress 2023Node Congress 2023
63 min
0 to Auth in an Hour Using NodeJS SDK
WorkshopFree
Passwordless authentication may seem complex, but it is simple to add it to any app using the right tool.
We will enhance a full-stack JS application (Node.JS backend + React frontend) to authenticate users with OAuth (social login) and One Time Passwords (email), including:- User authentication - Managing user interactions, returning session / refresh JWTs- Session management and validation - Storing the session for subsequent client requests, validating / refreshing sessions
At the end of the workshop, we will also touch on another approach to code authentication using frontend Descope Flows (drag-and-drop workflows), while keeping only session validation in the backend. With this, we will also show how easy it is to enable biometrics and other passwordless authentication methods.
Table of contents- A quick intro to core authentication concepts- Coding- Why passwordless matters
Prerequisites- IDE for your choice- Node 18 or higher
JSNation 2023JSNation 2023
104 min
Build and Deploy a Backend With Fastify & Platformatic
WorkshopFree
Platformatic allows you to rapidly develop GraphQL and REST APIs with minimal effort. The best part is that it also allows you to unleash the full potential of Node.js and Fastify whenever you need to. You can fully customise a Platformatic application by writing your own additional features and plugins. In the workshop, we’ll cover both our Open Source modules and our Cloud offering:- Platformatic OSS (open-source software) — Tools and libraries for rapidly building robust applications with Node.js (https://oss.platformatic.dev/).- Platformatic Cloud (currently in beta) — Our hosting platform that includes features such as preview apps, built-in metrics and integration with your Git flow (https://platformatic.dev/). 
In this workshop you'll learn how to develop APIs with Fastify and deploy them to the Platformatic Cloud.
JSNation Live 2021JSNation Live 2021
156 min
Building a Hyper Fast Web Server with Deno
WorkshopFree
Deno 1.9 introduced a new web server API that takes advantage of Hyper, a fast and correct HTTP implementation for Rust. Using this API instead of the std/http implementation increases performance and provides support for HTTP2. In this workshop, learn how to create a web server utilizing Hyper under the hood and boost the performance for your web apps.
JSNation 2022JSNation 2022
41 min
Build a chat room with Appwrite and React
WorkshopFree
API's/Backends are difficult and we need websockets. You will be using VS Code as your editor, Parcel.js, Chakra-ui, React, React Icons, and Appwrite. By the end of this workshop, you will have the knowledge to build a real-time app using Appwrite and zero API development. Follow along and you'll have an awesome chat app to show off!