NodeJS: inicio rápido



¡Hola a todos! Muy pronto, comenzará el curso para desarrolladores de Node.js , en relación con el cual realizamos una lección abierta tradicional . El seminario web examinó las fortalezas y debilidades de Node, y también discutió para qué tareas esta plataforma de software es la más adecuada y para qué otros lenguajes y marcos deberían elegirse. Y, por supuesto, no sin práctica. Para ejecutar los ejemplos y el software necesarios para instalar Node.js .

Profesor: Alexander Korzhikov , ingeniero informático de desarrollo en ING Group (Países Bajos).






Algunas palabras sobre Node.js


Node.js es un tiempo de ejecución de JavaScript asíncrono basado en conceptos como Event Loop y arquitectura orientada a eventos. La plataforma Node.js y el administrador de paquetes NPM estándar le permiten crear aplicaciones efectivas para diversas áreas temáticas, desde la Web hasta el aprendizaje automático.

El ejemplo más simple de servidor web ( node server.js):

const http = require('http')
const hostname = '127.0.0.1'
const port = 3000
const server = http.createServer((req, res) => {
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
res.end('Hello World\n')
})
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`)
})

Mirando el código anterior, se pueden observar las siguientes características de Node.js:

  1. Podemos ejecutar código JavaScript directamente en el servidor, es decir, es posible ejecutar archivos JavaScript utilizando el comando de nodo.
  2. Se admite el formato CommonJS de módulos para cargar dependencias y módulos ES, y se pueden usar ambos formatos.
  3. Se admite una biblioteca de módulos estándar, de la cual HTTP forma parte.
  4. La API se basa en el patrón de devoluciones de llamada asincrónicas, pero también se admite Promise.
  5. Se admite la sintaxis de ES2015. Por cierto, aquí hay un enlace útil con el que siempre puede ver en qué versión de Node qué funciones JS son compatibles . Si algo sale mal, puede comparar y comprender cuál es el problema.

Tampoco te pierdas la pequeña demostración (VSCode + Chrome Debug).

Una breve excursión a la historia.


La plataforma Node.js apareció en 2009, el principal desarrollador y creador del proyecto fue Ryan Dahl. Su idea principal era crear una E / S sin bloqueo (entrada-salida) para el servidor, además, usando JavaScript. En ese momento, tales enfoques no eran muy comunes, y JavaScript era una de las mejores soluciones.

Node.js usa el motor Chromium dentro de sí mismo, o más bien, esa parte de él que interpreta JavaScript - V8 . Debido al hecho de que el intérprete se separó en un proyecto V8 por separado, se hizo posible simplemente crear un ecosistema a su alrededor. Hablando estrictamente, esto es exactamente lo que hizo el creador de Node.js Ryan Dahl. Por cierto, hoy existe la Fundación Node.js, una organización que apoya el proyecto.



Estructura


En primer lugar, la biblioteca está escrita en C ++ y JavaScript. El proyecto en sí se encuentra en GitHub , por lo que si tiene curiosidad, puede familiarizarse con su código fuente. Puede profundizar en su estudio durante mucho tiempo)).

En segundo lugar, como ya se mencionó, incluye V8 (la plataforma de ejecución de JavaScript de Google) y libuv como parte del bucle de eventos (bucle de eventos asíncrono).

Bueno, por supuesto, hay varios módulos para trabajar con el sistema operativo que le permiten realizar las tareas comerciales que necesita.

También vale la pena mencionar los principales patrones de diseño que se usan comúnmente en Node.js:

  • Devolución de llamada (ya se mencionó);
  • Observador (patrón de evento más simple);
  • Módulo (aunque ahora está organizado en el lenguaje JavaScript mismo, en Node.js sigue siendo relevante);
  • Reactor (patrón de interacción asincrónica con algunos recursos cuando no bloquea la secuencia principal de código). Este patrón es familiar para los desarrolladores de JS. Por ejemplo, si trabajamos en un navegador y escribimos un frontend, no bloqueamos todo el trabajo del navegador, sino que simplemente nos suscribimos a los eventos del usuario, y cuando ocurre un evento (después de un "clic", "enter", etc.), ejecutamos nuestro código

Por cierto, aquí hay una pequeña competencia que tuvimos en el seminario web)). Y seguir adelante.

Módulos de distribución estándar de nodo




¿Sabes qué módulos están incluidos en la distribución de Nodo estándar? Es decir, estamos hablando de módulos que ya están integrados, por lo tanto, no se pueden instalar. En general, hay alrededor de 50 de ellos, enumeremos los principales. Para facilitar la percepción, los dividimos convencionalmente en 5 puntos:

1. Principal (para operaciones ordinarias):

  • fs;
  • temporizadores
  • streams (para trabajar con streams).

2. Utilidades:

  • ruta (para trabajar con rutas);
  • util;
  • zlib (archivo y descompresión);
  • cripto (para funciones criptográficas).

3. Procesos (todo lo relacionado con multiprocesamiento y paralelismo):

  • child_process (el módulo principal para lanzar módulos menores, brinda grandes oportunidades para iniciar y monitorear procesos);
  • clúster (similar al primero, pero le permite paralelizar tareas en los núcleos de su procesador);
  • trabajador_procesos (implementación de subprocesos o subprocesos, pero no es completamente seguro para subprocesos, pero es mejor leer la documentación).

4. Protocolos (todo tipo de protocolos):

  • http (s);
  • red;
  • dns.

5. Sistema (respectivamente, módulos del sistema, incluida la depuración):

  • os
  • v8;
  • async_hooks;
  • perf_hooks;
  • eventos_traza

Qué más agregar:

- objeto global - análogo de ventana;
- todos los objetos de JavaScript que están disponibles en el navegador también están disponibles en Node.js;
- tiempos de espera - casi como en un navegador;
- proceso - representación del proceso actual;
- La consola está disponible.

Devoluciones de llamada


Devolución de llamada: una función pasada como argumento al código, que implica ejecutarlo en algún momento. Por cierto, las personas rara vez piensan que su ejecución puede ser sincrónica o asincrónica.

const server = http.createServer((req, res) => {
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
res.end('Hello World\n')
})
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`)
})

En el nodo, por defecto, la devolución de llamada se ejecuta con un "error" y el resultado es asíncrono:

fs.readFile('/etc/passwd', (err, data) => {
if (err) throw err
console.log(data)
})

Y así es como se ve el antipatrón: un buen ejemplo de cómo usar Callbacks incorrectamente. Como dicen, el clásico Callback Hell :

fs.readdir(source, function (err, files) {
if (err) {
console.log('Error finding files: ' + err)
} else {
files.forEach(function (filename, fileIndex) {
console.log(filename)
gm(source + filename).size(function (err, values) {
if (err) {
console.log('Error identifying file size: ' + err)
} else {
console.log(filename + ' : ' + values)
aspect = (values.width / values.height)
widths.forEach(function (width, widthIndex) {
height = Math.round(width / aspect)
console.log('resizing ' + filename + 'to ' + height + 'x' + height)
this.resize(width, height).write(dest + 'w' + width + '_' + filename, function(err) {
if (err) console.log('Error writing file: ' + err)
})
}.bind(this))
}
})
})
}
})

Ahora veamos cómo crear un servidor web simple y representar el índice HTML como respuesta del cliente:

const http = require('http')
const server = http.createServer((req, res) => {
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
res.end('Hello World\n')
})

Para leer el archivo html local:

const fs = require('fs')
fs.readFile('./index.html', (err, text) => {
console.log(text)
})

Terminando el tema de las devoluciones de llamada, me gustaría mencionar los tipos de devolución de llamada. Hay devoluciones de llamada que devuelven solo un error si hay un error:

fs.access('/etc/passwd', fs.constants.R_OK, (err) => {
console.log(err ? 'no access!' : 'read')
})

También ahora, cada vez más módulos y API usan Promesas listas para usar, lo cual es bueno. Nodo admite promesas:

util.promisify()
fs.promises.*

Tipo de devolución:

http.request('https://example.com', (error, response, body) => {
...
})

Nodo Q&A


Al escribir servidores web, a menudo se usa Express, aunque hay muchas otras bibliotecas y marcos que implementan una funcionalidad similar. Sin embargo, Express es el más popular y estable. Se podría decir que este es el estándar para escribir servidores.

import express from "express";
const app = express();
const port = 3000;
app.get("/", (req, res) => {
res.send("Hello World!");
});
app.listen(port, () => {
console.log(`Example app listening
});



Bueno, ahora puede intentar crear un servidor web con un generador Express usted mismo :

  • usando jade, sesión de cookies;
  • haciendo un cierre de sesión de inicio de sesión ingenuo.

O simplemente mire cómo lo hizo el maestro, que preparó la solución preparada en TypeScript.

Eso es todo. Finalmente, un par de enlaces útiles:


Y nos vemos en el curso .

All Articles