nicolas restrepo
javascript developer
un poco de historia de nodejs
como esta construido nodejs
Que es nodeJs
Event Loop en nodejs
Call Stack
Node.js es un entorno de ejecución de JavaScript de código abierto y multiplataforma.
Comunidad muy amplia
👈🏻😍
Node fue creado en 2009 por Ryan Dahl programador en ese entonces de la empresa Joyent (dedicada a ofrecer servicios de cómputo en la nube) que a su vez se convirtió en la propietaria de la marca Node.js™ y la que le daría patrocinio y difusión desde el momento de su creación.
nada interesante, sigue la adopcion
Node.js se ejecuta en el motor JavaScript V8, el núcleo de Google Chrome, fuera del navegador.
V8 es el motor de JavaScript y WebAssembly de alto rendimiento de código abierto de Google, escrito en C ++.
Una aplicación Node.js se ejecuta en un solo proceso no bloqueante, sin crear un nuevo hilo para cada solicitud.
Esta es una limitación que en realidad es muy útil, ya que simplifica mucho la forma en que programa sin preocuparse por problemas de concurrencia.
Solo necesita prestar atención a cómo escribe su código y evitar cualquier cosa que pueda bloquear el hilo, como llamadas de red síncronas o bucles infinitos.
Una buena forma de garantizar esto es razonar sobre la "complejidad computacional" de sus devoluciones de llamada.
En la complejidad computacional tratamos de clasificar los problemas que pueden, o no pueden ser resueltos con una cantidad determinada de recursos (tiempo y memoria).
una devolución de llamada en tiempo constante.
app.get('/constant-time', (req, res) => {
res.sendStatus(200);
});Complejidad O(n)
app.get('/countToN', (req, res) => {
let n = req.query.n;
// n iterations before giving someone else a turn
for (let i = 0; i < n; i++) {
console.log(`Iter ${i}`);
}
res.sendStatus(200);
});se ejecutara rapidamente cuando n es un numero pequeño, pero lento y podria bloquear si n es un numero grande
Complejidad O(n^2)
app.get('/countToN2', (req, res) => {
let n = req.query.n;
// n^2 iterations before giving someone else a turn
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
console.log(`Iter ${i}.${j}`);
}
}
res.sendStatus(200);
});Estas API son caras, porque implican un cálculo significativo (cifrado, compresión), y deben se usadas con cuidado ya que podemos bloquear el Event Loop.
El Call Stack es una pila LIFO (Last In, First Out).
El Event Loop comprueba continuamente el Call Stack para ver si hay alguna función que deba ejecutarse.
const bar = () => console.log('bar')
const baz = () => console.log('baz')
const foo = () => {
console.log('foo')
bar()
baz()
}
foo()Cuando se ejecuta este código, primero foo() se llama. En el interior foo(), primero llamamos bar(), luego llamamos baz().
const bar = () => console.log('bar')
const baz = () => console.log('baz')
const foo = () => {
console.log('foo')
setTimeout(bar, 0)
baz()
}
foo()Cuando se llama a setTimeout (), Javascript inicia el temporizador. Una vez que expira el temporizador, en este caso inmediatamente, cuando ponemos 0 como tiempo de espera, la función de devolución de llamada se coloca en la cola de mensajes .
ECMAScript 2015 introdujo el concepto de cola de trabajos, que es utilizado por Promises (también introducido en ES6 / ES2015). Es una forma de ejecutar el resultado de una función asíncrona lo antes posible, en lugar de colocarlo al final de la pila de llamadas.
Text
const bar = () => console.log('bar')
const baz = () => console.log('baz')
const foo = () => {
console.log('foo')
setTimeout(bar, 0)
new Promise((resolve, reject) =>
resolve('should be right after baz, before bar')
).then(resolve => console.log(resolve))
baz()
}
foo()By nicolas restrepo