Bun, Deno, Node.js? Recreando un tiempo de ejecución de JavaScript desde cero - Comprende la magia detrás de Node.js

Rate this content
Bookmark

Bun, Deno y muchos otros tiempos de ejecución de JavaScript han sido elogiados, 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é hay tantos nuevos tiempos de ejecución de JavaScript surgiendo. 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 está 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.

Esta charla cubrirá los siguientes temas:
- ¿Qué es un motor de JavaScript - V8
- ¿Por qué Node.js utiliza Libuv
- Cómo crear un tiempo de ejecución de JS desde cero

This talk has been presented at Node Congress 2023, check out the latest edition of this JavaScript Conference.

FAQ

Node.js es un entorno de ejecución de JavaScript que utiliza V8 para interpretar JavaScript y libuv para manejar operaciones asíncronas. V8 se encarga de la gramática y los tipos de datos de JavaScript, mientras que libuv gestiona el bucle de eventos y la concurrencia.

El presentador intentó reimplementar Node.js, incluyendo características como WebSockets y la cobertura de código. También exploró la implementación de funciones como 'print' y 'setTimeout' en C++ y su integración en el contexto de V8.

Mencionar Node.js en una entrevista de trabajo puede ser crucial porque demuestra conocimiento en tecnologías de backend modernas y experiencia con sistemas asincrónicos y el manejo de eventos, habilidades valoradas en el desarrollo de software.

Funciones como 'setTimeout' y 'console.log' no son parte de ECMAScript y provienen del entorno de Node.js. Estas funciones son implementadas en C++ y expuestas a JavaScript a través de V8.

El presentador investigó en el sitio web oficial de Node.js, exploró enlaces y recursos disponibles allí, y realizó experimentos prácticos para entender mejor cómo funciona el bucle de eventos y la concurrencia en Node.js.

La curiosidad y el deseo de entender profundamente cómo funciona Node.js detrás de escena motivaron al presentador. Además, quería llenar un vacío de contenido sobre Node.js en internet, compartiendo su aprendizaje a través de tutoriales y un libro electrónico.

Libuv es una biblioteca que proporciona el soporte para las operaciones de entrada/salida asincrónicas en Node.js. Gestiona el bucle de eventos, permitiendo que Node.js realice operaciones no bloqueantes y maneje múltiples conexiones simultáneamente.

El presentador implementó nuevas funciones en Node.js escribiendo funciones de C++ y vinculándolas al contexto de V8. Utilizó un puente C++ para integrar estas funciones, permitiendo su uso en JavaScript.

Erick Wendel
Erick Wendel
29 min
14 Apr, 2023

Comments

Sign in or register to post your comment.

Video Summary and Transcription

La charla explora la magia detrás de Node.js y profundiza en sus componentes, incluyendo V8, libuv y el puente C++. Se discute el flujo de trabajo y el proceso de ejecución, el uso de NodeMod y la comprensión de las funciones de la consola. La charla también cubre las funciones y programación de Node.js, la introducción de tiempos de ejecución y la colaboración entre los tiempos de ejecución de JavaScript. Concluye con ideas sobre la producción de contenido, la elección de Node.js y la inspiración detrás de él.

1. Introducción a Node.js y mi investigación

Short description:

Hoy, les hablaré sobre algunos experimentos, algunas ciencias locas que he estado haciendo usando JavaScript y muchas cosas más. Comencé a investigar sobre Node.js y encontré información contradictoria. Así que decidí crear un tutorial basado en mi propia investigación. Vamos a entender la magia detrás de Node.js y explorar el repositorio de Node.js.

Hoy, les hablaré sobre algunos experimentos, algunas ciencias locas que he estado haciendo usando JavaScript y muchas cosas más, y espero que les guste mucho este contenido porque fue un verdadero esfuerzo crear todo esto. Para comenzar, todo lo que les mostraré hoy ya está en línea, así que después de la charla les mostraré algunos enlaces para que puedan ir allí, pero por favor, si pueden, tomen una foto de esta charla, mencionen el evento, mencionenme porque esto nos ayuda mucho con el trabajo que hemos estado haciendo. Muy bien. Estoy muy emocionado, voy a hablar sobre Node.js y el creador de NodeJS está aquí, el bun, y así sucesivamente. Así que es bastante asombroso. Bueno, en primer lugar, he estado haciendo muchos otros experimentos. Estaba tratando de volver a implementar Node.js, re-implementando WebSockets, re-implementando la cobertura de código, así que he estado haciendo muchas preguntas específicas, así que estoy muy curioso, y todos estos tutoriales están allí para que también los encuentren. Bueno, todo este experimento comenzó cuando comencé a preguntarme, bueno, ¿realmente sé qué es Node.js? Así que comencé a investigar y descubrí que algunos artículos decían que V8 hace una cosa, Libuv hace otra, JavaScript tiene otro papel, y a veces un artículo era controvertido con otro, así que pensé, hmm, tal vez debería aprender más, tal vez debería entender mejor. Así que realmente no sé qué está sucediendo detrás de escena, cómo está funcionando realmente. Así que comencé a investigar un poco y descubrí que no hay contenido sobre esto. Nadie ha recreado todo esto, compilando todas las bibliotecas, pero comencé a investigar en el sitio web de Node.js, y esos enlaces me ayudaron mucho a aprender cómo funciona el bucle de eventos, cómo funciona el módulo de concurrencia en Node.js, pero aún así, quería más. Así que por eso creé este tutorial. Este es un tutorial completo paso a paso, en el que se basa esta charla, así que esta charla va a ser muchos aspectos destacados, porque no puedo mostrar todo práctico aquí. Así que pueden probarlo más tarde. Solo un aviso antes de continuar, voy a decirles, todo lo que hay aquí es parte de mi investigación, ¿de acuerdo? No soy un desarrollador de C++. Es posible que vean muchas malas prácticas allí, pero es algo que disfruté haciendo. Además, esto es parte de mi propia investigación. Como les dije, no hay contenido en Internet. Así que comencé a preguntar a algunos amigos, a mirar el código fuente y a hacer algunas suposiciones. Y solo un aviso, los autores de los JS Runtimers, son increíbles. Comencé a valorarlos más a medida que vi lo complejo que es detrás pueden usar JavaScript allí. Muy bien, vamos a la parte divertida, ¿verdad? Así que vamos a entender la magia detrás de Node.js. Todo esto, lo hice como un Gitpod. Hice todo el entorno para ustedes allí mismo. Son binarios y muchas cosas que pueden comenzar a usar de inmediato. Para comenzar, pensé, ¿qué pasa si voy al repositorio de Node.js y trato de encontrar cómo Ryan Doll estaba haciendo esto? Así que descubrí muchos archivos. Y descubrí como, oh, tal vez debería intentar reproducir esto, pero si ven, fue hace 14 años. Como muchas herramientas, ni siquiera funciona más. Pero aún así, ¿alguien ha visto este sitio web antes?

2. Introducción a los Componentes de Node.js

Short description:

Esta fue la primera versión lanzada de Node.js. Es la V001. Y puedes ver que en ese entonces no había console.log. Era puts. Muy bien. Traté de dividir los componentes principales para que puedas entender el papel de cada uno. Vamos a hablar sobre V8, libuv y el impresionante puente C++. Voy a intentar implementar una nueva función en el lado de V8. Echemos un vistazo a nuestro código JS y creemos una función de impresión en C++. Detrás de escena, V8 es como el evolucionador. Una función setTimeout es algo asíncrono, depende del entorno. Por eso Node.js es tan bueno, porque es extensible. La mayoría de los entornos de ejecución de JS siguen la misma idea. Voy a intentar hacer algunos experimentos usando nuestro código JavaScript. Aquí está todo el proyecto en C++.

Nadie. Esto es muy bueno. Esta fue la primera versión lanzada de Node.js. Es la V001. Y puedes ver que en ese entonces no había console.log. Era puts. Muy bien. Muy bien. Sé que este es un tema muy complejo, así que no te haré dormir aquí mismo, ¿de acuerdo? Así que traté de dividir los componentes principales para que puedas entender el papel de cada uno. Si estás buscando trabajo, esto es genial para mencionar en la entrevista.

Primero, vamos a hablar sobre V8. V8 es la gramática, son los tipos de datos de JavaScript, es cómo se interpreta JavaScript, lo que significa una clase, una variable, un tipo de datos, todo está en V8. También tenemos libuv. Libuv es la parte asíncrona de la que hemos estado hablando mucho. Pero solo piensa en ello como un while true que busca nuevos eventos y, si los hay, si hay eventos pendientes, los despacha todos y puedes comenzar a recibir más datos y así sucesivamente. Y aquí, para mí, está la parte asombrosa. El puente C++. Así que cuando intentes encontrar, te darás cuenta de que Node.js es casi todo en C++. Voy a intentar algo mágico contigo, intentando implementar una nueva función en el lado de V8. Así que echemos un vistazo a nuestro código JS. Cuando comienzas a usar V8 desde cero, nuestro contexto, nuestro disco global está vacío. Entonces no hay nada allí que podamos usar, pero voy a intentar implementar la función de impresión. Print no existe en JavaScript, ¿de acuerdo? Entonces, si quiero poder ejecutar esta función desde el lado de JavaScript, esto debe estar en V8. Así que usando el puente C++, voy a crear una función de impresión en C++, y luego la voy a vincular al contexto. Verás, diría que cada vez que vea esta cadena, voy a llamar a esta función de C++. Detrás de escena, V8 es como el evolucionador, ¿verdad? Está evaluando todo lo que quieres. Bien, vamos a intentar hacer algo más difícil. Una función setTimeout es algo asíncrono, depende del entorno, así que podemos usar uvstart, que son funciones de libuv. Hacemos exactamente lo mismo, mapeamos esta cadena a esta función de C++ y luego ya está disponible en V8. Te digo, esta fue la parte para mí como, oh dios mío, por eso esto es tan bueno, porque es extensible, ¿verdad? La mayoría de los entornos de ejecución de JS siguen la misma idea, extienden el entorno de ejecución de JavaScript y hacen muchas cosas geniales. Así que aquí mismo, voy a intentar hacer algunos experimentos usando nuestro código JavaScript. Aquí puedo

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

Es una jungla ahí fuera: ¿Qué está pasando realmente dentro de tu carpeta Node_Modules?
Node Congress 2022Node Congress 2022
26 min
Es una jungla ahí fuera: ¿Qué está pasando realmente dentro de tu carpeta Node_Modules?
Top Content
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.
Hacia una Biblioteca Estándar para Runtimes de JavaScript
Node Congress 2022Node Congress 2022
34 min
Hacia una Biblioteca Estándar para Runtimes de JavaScript
Top Content
There is a need for a standard library of APIs for JavaScript runtimes, as there are currently multiple ways to perform fundamental tasks like base64 encoding. JavaScript runtimes have historically lacked a standard library, causing friction and difficulty for developers. The idea of a small core has both benefits and drawbacks, with some runtimes abusing it to limit innovation. There is a misalignment between Node and web browsers in terms of functionality and API standards. The proposal is to involve browser developers in conversations about API standardization and to create a common standard library for JavaScript runtimes.
ESM Loaders: Mejorando la carga de módulos en Node.js
JSNation 2023JSNation 2023
22 min
ESM Loaders: Mejorando la carga de módulos en Node.js
ESM Loaders enhance module loading in Node.js by resolving URLs and reading files from the disk. Module loaders can override modules and change how they are found. Enhancing the loading phase involves loading directly from HTTP and loading TypeScript code without building it. The loader in the module URL handles URL resolution and uses fetch to fetch the source code. Loaders can be chained together to load from different sources, transform source code, and resolve URLs differently. The future of module loading enhancements is promising and simple to use.
Cómo Bun hace que la construcción de aplicaciones React sea más simple y rápida
React Day Berlin 2022React Day Berlin 2022
9 min
Cómo Bun hace que la construcción de aplicaciones React sea más simple y rápida
BUN is a modern all-in-one JavaScript runtime environment that achieves new levels of performance. It includes BUN dev, a fast front-end dev server, BUN install, a speedy package manager, and BUN run, a fast package runner. BUN supports JSX, has optimized React server-side rendering, and offers hot module reloading on the server. The priorities for BUN include stability, node compatibility, documentation improvement, missing features in BUN install, AST plugin API, native Windows support, Bundler and Minifier optimization, and easier deployment to production. BUN's AST plugin API allows for bundle-time JavaScript execution and embedding code, potentially inspiring new frameworks.
Diagnostics de Node.js listos para usar
Node Congress 2022Node Congress 2022
34 min
Diagnostics de Node.js listos para usar
This talk covers various techniques for getting diagnostics information out of Node.js, including debugging with environment variables, handling warnings and deprecations, tracing uncaught exceptions and process exit, using the v8 inspector and dev tools, and generating diagnostic reports. The speaker also mentions areas for improvement in Node.js diagnostics and provides resources for learning and contributing. Additionally, the responsibilities of the Technical Steering Committee in the TS community are discussed.
Compatibilidad con Node.js en Deno
Node Congress 2022Node Congress 2022
34 min
Compatibilidad con Node.js en Deno
Deno aims to provide Node.js compatibility to make migration smoother and easier. While Deno can run apps and libraries offered for Node.js, not all are supported yet. There are trade-offs to consider, such as incompatible APIs and a less ideal developer experience. Deno is working on improving compatibility and the transition process. Efforts include porting Node.js modules, exploring a superset approach, and transparent package installation from npm.

Workshops on related topic

Masterclass de Node.js
Node Congress 2023Node Congress 2023
109 min
Masterclass de Node.js
Top Content
Workshop
Matteo Collina
Matteo Collina
¿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.

Nivel: intermedio
Construye y Despliega un Backend con Fastify y Platformatic
JSNation 2023JSNation 2023
104 min
Construye y Despliega un Backend con Fastify y Platformatic
WorkshopFree
Matteo Collina
Matteo Collina
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
JSNation Live 2021JSNation Live 2021
156 min
Construyendo un Servidor Web Hiper Rápido con Deno
WorkshopFree
Matt Landers
Will Johnston
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.
0 a Auth en una Hora Usando NodeJS SDK
Node Congress 2023Node Congress 2023
63 min
0 a Auth en una Hora Usando NodeJS SDK
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 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
Construye aplicaciones peer-to-peer con Pear Runtime
JSNation 2024JSNation 2024
152 min
Construye aplicaciones peer-to-peer con Pear Runtime
WorkshopFree
David Mark Clements
David Mark Clements
Aprende cómo construir rápidamente aplicaciones peer-to-peer con Pear Runtime. No se requieren servidores. Comprende los paradigmas peer-to-peer y construye aplicaciones a partir de bloques de construcción bien definidos. En este masterclass se cubrirá cómo crear aplicaciones de escritorio y terminales (con discusión para móviles) que funcionan completamente peer-to-peer desde cualquier lugar del mundo. Al final de este masterclass, deberías saber cómo construir un nuevo tipo de aplicación altamente escalable con costos infraestructurales reducidos (~0) junto con arquitecturas adecuadas y mejores prácticas para aplicaciones peer-to-peer. Del creador de Pear Runtime y la compañía que nos trae keet.io. Tabla de contenido:- Introducción a Pear- Preguntas y respuestas iniciales- Configuración- Creación de una aplicación de escritorio Pear- Compartir una aplicación Pear- Ejecutar una aplicación Pear- Creación de una aplicación terminal Pear- Lanzamiento de una aplicación Pear- Discusiones arquitecturales- Preguntas y respuestas finales
GraphQL: De Cero a Héroe en 3 horas
React Summit 2022React Summit 2022
164 min
GraphQL: De Cero a Héroe en 3 horas
Workshop
Pawel Sawicki
Pawel Sawicki
Cómo construir una aplicación GraphQL fullstack (Postgres + NestJs + React) en el menor tiempo posible.
Todos los comienzos son difíciles. Incluso más difícil que elegir la tecnología es desarrollar una arquitectura adecuada. Especialmente cuando se trata de GraphQL.
En este masterclass, obtendrás una variedad de mejores prácticas que normalmente tendrías que trabajar en varios proyectos, todo en solo tres horas.
Siempre has querido participar en un hackathon para poner algo en funcionamiento en el menor tiempo posible, entonces participa activamente en este masterclass y únete a los procesos de pensamiento del instructor.