Node.js

 

 Para la primera sesion tendremos 🥁

un poco de historia de nodejs

como esta construido nodejs

Que es nodeJs

Event Loop en nodejs

Call Stack

Que es Node.js? 🤔

Node.js es un entorno de ejecución de JavaScript de código abierto y multiplataforma.

Comunidad muy amplia

👈🏻😍

Diferencias entre Node.js y el Browser 🧐

  • En Nodejs no hacemos ningun manejo del dom, o de otras api como cookies, que solo existen en el browser
  • En nodejs tu controlas el entorno, a diferencia del browser donde no puede darse el lujo de elegir qué navegador usarán sus visitantes, esto es muy conveniente.
  • Node.js usa el sistema de módulos CommonJS, mientras que en el navegador estamos empezando a ver que se está implementando el estándar de  ES Modules

Commonjs vs ESM

  • CommonJS sólo permite cargar módulos de forma síncrona, mientras que ESM permite carga síncrona y asíncrona.
  • Los require de CommonJS no son compatibles en el navegador de forma directa, mientras que los import de ESM si lo son si se indica el atributo <script type="module"> en los scripts que los utilicen.
  • NodeJS soporta tradicionalmente la sintaxis require de CommonJS, y aunque cada vez soporta mejor ESM, aún el soporte no es completo y tiene una amplia comunidad con paquetes utilizando CommonJS a través de NPM.

Hablemos un poco de historia 🥱

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.

2009

  • Nace Node.js
  • Se crea la primera forma de npm

2010

 

2011

  • npm llega a la versión 1.0
  • Las empresas más grandes comienzan a adoptar Node.js: LinkedIn, Uber, etc.
  • hapi nace

 

2012

2014

2013

nada interesante, sigue la adopcion

  • Primera gran plataforma de blogs con Node.js: Ghost
  • Nace la koa
  • Big Fork: io.js es una bifurcación importante de Node.js, con el objetivo de introducir el soporte de ES6 y moverse más rápido

2015

2016

  • La Fundación Node.js nace
  • IO.js se fusiona de nuevo con Node.js
  • npm presenta módulos privados
  • Node.js 4 (versiones 1, 2 y 3 nunca lanzadas anteriormente)

 

  • Nace Yarn
  • Node.js 6
  • npm se centra más en la seguridad
  • Node.js 8
  • HTTP / 2
  • V8 introduce Node.js en su suite de pruebas, lo que convierte oficialmente a Node.js en un objetivo para el motor JS, además de Chrome.
  • 3 mil millones de descargas de npm cada semana

2017

2018

  • Node.js 10
  • Soporte experimental de módulos ES .mjs
  • Node.js 11

 

 

  • Node.js 12
  • Node.js 13

 

  • Node.js 14
  • Node.js 15

2019

2020

Como esta construido? 🧐

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 ++.

Continuemos con Nodejs

Una aplicación Node.js se ejecuta en un solo proceso no bloqueante, sin crear un nuevo hilo para cada solicitud.

Event Loop ? 🤔

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.

No bloquear el Event Loop 🚫

Una buena forma de garantizar esto es razonar sobre la "complejidad computacional" de sus devoluciones de llamada.

Wait wait Que es Complejidad Computacional.. 😩

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).

y entonces en NodeJs que ? 🤔

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);
});

Otro ejemplo que puede bloquear el event Loop y muchas veces no nos enteramos

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.

otro aspecto importante Call Stack ? 

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.

Cola de trabajos de ES6

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()

deck

By nicolas restrepo

deck

  • 227