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.
This talk has been presented at JSNation 2023, check out the latest edition of this JavaScript Conference.
FAQ
Para recrear Node.js desde cero es necesario entender y utilizar componentes como V8 para interpretar JavaScript, C++ para enlazar respuestas y libuv para manejar eventos. Se recomienda comenzar por proyectos existentes en GitHub y estudiar cómo funcionan internamente los componentes.
En la última diapositiva se incluyen diapositivas, enlaces, referencias y un tutorial que los asistentes pueden seguir después de la conferencia para profundizar en el aprendizaje y experimentación con Node.js.
Tomar fotos durante la conferencia es importante porque ayuda a documentar el evento, generar contenido para compartir y promover el trabajo de los organizadores y participantes a través de menciones en redes sociales.
Implementar funciones como print y setTimeout es crucial para entender cómo Node.js extiende funcionalidades básicas de JavaScript mediante C++ y cómo se integran con elementos como V8 y libuv para manejar operaciones asíncronas y de impresión.
El ponente enfrentó desafíos como la falta de recursos directos y guías completas sobre cómo recrear Node.js, lo que le obligó a investigar profundamente y a establecer comunicaciones con expertos en la industria, incluyendo llamadas con personal de Google.
El historial de commits del repositorio de Node.js muestra que inicialmente era solo una prueba de concepto con muchos intentos fallidos y pruebas, lo que subraya la evolución y mejora continua del proyecto hasta convertirse en una herramienta robusta.
Las capacidades de V8 se pueden extender mediante la implementación de funciones en C++, que se integran en el motor V8 para añadir nuevas funcionalidades accesibles desde el código JavaScript.
Libuv juega un papel fundamental en Node.js como la biblioteca que permite la gestión de eventos asíncronos, la implementación de operaciones no bloqueantes y el manejo de múltiples hilos de ejecución a través del bucle de eventos.
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.
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!
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.
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.
The talk discusses the importance of supply chain security in the open source ecosystem, highlighting the risks of relying on open source code without proper code review. It explores the trend of supply chain attacks and the need for a new approach to detect and block malicious dependencies. The talk also introduces Socket, a tool that assesses the security of packages and provides automation and analysis to protect against malware and supply chain attacks. It emphasizes the need to prioritize security in software development and offers insights into potential solutions such as realms and Deno's command line flags.
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.
React query version five is live and we'll be discussing the migration process to server components using Next.js and React Query. The process involves planning, preparing, and setting up server components, migrating pages, adding layouts, and moving components to the server. We'll also explore the benefits of server components such as reducing JavaScript shipping, enabling powerful caching, and leveraging the features of the app router. Additionally, we'll cover topics like handling authentication, rendering in server components, and the impact on server load and costs.
This Talk discusses various strategies to improve React performance, including lazy loading iframes, analyzing and optimizing bundles, fixing barrel exports and tree shaking, removing dead code, and caching expensive computations. The speaker shares their experience in identifying and addressing performance issues in a real-world application. They also highlight the importance of regularly auditing webpack and bundle analyzers, using tools like Knip to find unused code, and contributing improvements to open source libraries.
Construye Aplicaciones Modernas Utilizando GraphQL y Javascript
Featured Workshop
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.
Construyendo una Aplicación de Shopify con React & Node
Top Content
WorkshopFree
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.
¿Alguna vez has tenido dificultades para diseñar y estructurar tus aplicaciones Node.js? Construir aplicaciones que estén bien organizadas, sean probables y extensibles no siempre es fácil. A menudo puede resultar ser mucho más complicado de lo que esperas. En este evento en vivo, Matteo te mostrará cómo construye aplicaciones Node.js desde cero. Aprenderás cómo aborda el diseño de aplicaciones y las filosofías que aplica para crear aplicaciones modulares, mantenibles y efectivas.
Platformatic te permite desarrollar rápidamente APIs GraphQL y REST con un esfuerzo mínimo. La mejor parte es que también te permite aprovechar todo el potencial de Node.js y Fastify cuando lo necesites. Puedes personalizar completamente una aplicación de Platformatic escribiendo tus propias características y complementos adicionales. En el masterclass, cubriremos tanto nuestros módulos de código abierto como nuestra oferta en la nube:- Platformatic OSS (open-source software) — Herramientas y bibliotecas para construir rápidamente aplicaciones robustas con Node.js (https://oss.platformatic.dev/).- Platformatic Cloud (actualmente en beta) — Nuestra plataforma de alojamiento que incluye características como aplicaciones de vista previa, métricas integradas e integración con tu flujo de Git (https://platformatic.dev/). En este masterclass aprenderás cómo desarrollar APIs con Fastify y desplegarlas en la nube de Platformatic.
Construyendo un Servidor Web Hiper Rápido con Deno
WorkshopFree
2 authors
Deno 1.9 introdujo una nueva API de servidor web que aprovecha Hyper, una implementación rápida y correcta de HTTP para Rust. El uso de esta API en lugar de la implementación std/http aumenta el rendimiento y proporciona soporte para HTTP2. En este masterclass, aprende cómo crear un servidor web utilizando Hyper en el fondo y mejorar el rendimiento de tus aplicaciones web.
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 de Node.JS + frontend de React) para autenticar usuarios con OAuth (inicio de sesión social) y contraseñas de un solo uso (correo electrónico), incluyendo:- Autenticación de usuario - Administrar interacciones de usuario, devolver JWT de sesión / actualización- Gestión y validación de sesiones - Almacenar la sesión para solicitudes de cliente posteriores, validar / actualizar sesiones Al final del masterclass, también tocaremos otro enfoque para la autenticación de código utilizando Flujos 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. Tabla de contenidos- Una breve introducción a los conceptos básicos de autenticación- Codificación- Por qué importa la autenticación sin contraseña Requisitos previos- IDE de tu elección- Node 18 o superior
Comments