Una guía para principiantes de Node.js Parte 2





¡Buen dia amigos!



Continúo para publicar una traducción de este tutorial Node.js .



Otras partes:



Parte 1

Parte 2

Parte 3

Parte 4



Motor JavaScript V8



V8 es el nombre del motor de JavaScript compatible con Google Chrome. Esto es lo que toma su código JavaScript y lo ejecuta en el navegador.



En otras palabras, V8 es un tiempo de ejecución de JavaScript. DOM y otras API web también están expuestas por el navegador.



El motor de JavaScript es independiente del navegador. Esto es lo que dio lugar a Node.js. V8 fue elegido como el motor de Node.js en 2009, y con la creciente popularidad de Node.js, V8 se ha convertido en la base de muchos JavaScript del lado del servidor.



El ecosistema de Node.js es enorme y, gracias a V8, podemos crear aplicaciones de escritorio, por ejemplo, utilizando Electron.



Otros motores JS


Otros navegadores tienen sus propios motores de JavaScript:





etc.



Todos estos motores implementan el estándar ECMA ES-262 (ECMAScript) , el estándar utilizado por JavaScript.



Sobre el rendimiento


V8 está escrito en C ++ y continúa evolucionando. Funciona en todos los sistemas operativos.



No consideraremos las características de la implementación de V8: puede encontrarlas aquí , cambian de vez en cuando, a menudo radicalmente.



V8 está en constante evolución, como otros motores de JavaScript, para mejorar la velocidad de la web y el ecosistema Node.js.



Hay una competencia de rendimiento en la web que ha estado sucediendo durante años, y nosotros (como usuarios y desarrolladores) sacamos mucho provecho de esta competencia a medida que recibimos herramientas más rápidas y mejores cada año.



Compilacion


JavaScript generalmente se comercializa como un lenguaje interpretado, pero los motores modernos no solo interpretan JavaScript, sino que lo compilan.



Esto ha estado sucediendo desde 2009 cuando se agregó el compilador SpiderMonkey JavaScript en Firefox 3.5.



JavaScript compila V8 sobre la marcha (justo a tiempo, JIT, compilación dinámica) para acelerarlo.



Puede sonar contradictorio, pero con la llegada de Google Maps en 2004, JavaScript ha evolucionado de un lenguaje en el que se escriben pequeños bloques de código a un lenguaje en el que se crean aplicaciones completas, que consisten en cientos o miles de líneas de código que se ejecutan en el navegador.



Hoy, nuestras aplicaciones de navegador pueden ejecutarse durante horas; ya no son herramientas simples para resolver tareas primitivas como la validación de formularios.



En el mundo actual, compilar JavaScript tiene sentido: aunque lleva más tiempo preparar el código, su rendimiento supera significativamente el rendimiento del código interpretado.



Ejecutar scripts de Node.js desde la línea de comandos



La forma estándar de ejecutar los programas Node.js es ejecutar un comando global nodey pasar el nombre del ejecutable.



Si se nombra el archivo principal de su aplicación Node.js app.js, puede llamarlo así:



node app.js


Al ejecutar el comando especificado, asegúrese de estar en el directorio con el archivo app.js.



¿Cómo salgo de Node.js?



Hay varias formas de detener una aplicación Node.js.



Cuando ejecuta un programa a través del terminal, puede cerrarlo ctrl-C, sin embargo, analicemos las formas programáticas.



Comencemos con el más radical y hablemos sobre por qué no debería usarse.



El (módulo del núcleo global) módulo principal processofrece un método fácil para salir de la aplicación de software de Node.js: process.exit().



Cuando Node.js alcanza esta línea de código, el proceso de ejecución del programa finaliza de inmediato.



Esto significa que cualquier devolución de llamada en curso, solicitudes enviadas (pendientes), acceso abierto al sistema de archivos, escrituras a, stdouto stderrtodas serán canceladas por completo.



Si esto es aceptable para usted, puede pasar exit()un número entero al método , una señal para completar el código:



process.exit(1)


Por defecto, el código de salida es 0, lo que indica éxito. Los diferentes códigos de salida tienen diferentes significados, puede usarlos para garantizar la interacción de algunos programas con otros.



Puede leer más sobre los códigos de salida aquí .



También puede asignar un valor apropiado a la propiedad exitCode:



process.exitCode = 1


y después de que finalice el programa, Node.js devolverá este código.



La ejecución del programa terminará suavemente cuando todos los procesos estén completos.



En Node.js, a menudo iniciamos el servidor:



const express = require('express')
const app = express()

app.get('/', (req, res) => {
    res.send('Hi!')
})

app.listen(3000, () => console.log('Server ready'))


Este programa nunca terminará. Si llama process.exit(), se anularán todas las solicitudes pendientes o en ejecución. No es genial



En este caso, es necesario enviar un comando de señal SIGTERMy procesarlo utilizando un procesador de señal de procesador ( processno es necesario conectarse, está disponible de forma predeterminada):



const express = require('express')

const app = express()

app.get('/', (req, res) => {
    res.send('Hi!')
})

const server = app.listen(3000, () => console.log('Server ready'))

process.on('SIGTERM', () => {
    server.close(() => {
        console.log('Process terminated')
    })
})


¿Qué son las señales? Las señales son un sistema de comunicación POSIX: notifican a un proceso que se ha producido un evento.



SIGKILL- señal sobre la finalización inmediata del proceso, similar process.exit().



SIGTERM- señal sobre el final suave del proceso. Esta señal puede ser enviada por un sistema de control de procesos como upstart, supervisordetc.



Puede enviar esta señal dentro del programa a través de otra función:



process.kill(process.id, 'SIGTERM')


O desde otro programa Node.js o cualquier otra aplicación que se ejecute en el sistema, siempre que conozcan el PID del proceso que desea finalizar.



¿Cómo leo las variables de entorno en Node.js?



El módulo principal Node.js processtiene una propiedad que envcontiene todas las variables de entorno establecidas cuando se inicia el proceso.



Aquí hay un ejemplo de acceso a la variable de entorno NODE_ENV predeterminada development:



process.env.NODE_ENV // development


Establecer un valor en producción antes de ejecutar el script le indicará a Node.js que tiene un entorno de producción por delante.



De manera similar, puede acceder a cualquier variable de entorno establecida.



Cómo usar el Node.js REPL



El comando se nodeusa para ejecutar scripts Node.js:



node script.js 


Si omitimos el nombre del archivo, entraremos en modo REPL:



node 


REPL (Run Evaluate Print Loop) es un entorno de ejecución de código (generalmente una ventana de terminal) que toma una expresión ingresada por el usuario y devuelve el resultado de evaluar esa expresión.



Si escribe nodeen la terminal, sucederá lo siguiente:



>


El terminal entrará en modo de espera.



Para ser más precisos, el terminal en este caso está esperando que se ingrese algún código JavaScript.



Vamos a presentar lo siguiente:



> console.log('test')
test 
undefined 
>


El primer valor testes lo que le dijimos a la consola, luego obtenemos el undefinedvalor que devolvió la ejecución y console.log()



luego podemos ingresar algo más.



Usar tabpara autocompletar


REPL es interactivo.



Si hace clic tabmientras escribe código, REPL intentará completar la escritura eligiendo entre variables previamente definidas o predefinidas.



Objetos JavaScript


Intente escribir el nombre de la clase JavaScript, por ejemplo, Numberagregue un punto y haga clic tab.



El REPL mostrará todas las propiedades y métodos de esta clase:







Objetos globales


Puede obtener una lista de objetos globales escribiendo global.y presionando tab:







Variable especial _


Si escribe al final del código _, se mostrará el resultado de la última operación.



Comandos después del punto


El REPL contiene algunos comandos especiales que comienzan con un punto. Aquí están:



  • .help - muestra una lista de comandos disponibles
  • .editor- incluye modo de edición para escribir código JavaScript de varias líneas. Para ejecutar el código en este modo, presionectrl-D
  • .break- deja de ingresar el código de varias líneas. Similar a presionarctrl-C
  • .clear - restablece el contexto REPL a un objeto vacío, elimina todo el código ingresado
  • .load - carga un archivo JavaScript ubicado en el directorio actual (de trabajo)
  • .save - guarda la sesión REPL en un archivo con el nombre especificado
  • .exit- Salga de REPL. Como doble toquectrl-C


El REPL entiende que está ingresando código de varias líneas sin llamar .editor.



Por ejemplo, si comenzó a implementar la iteración:



[1, 2, 3].forEach(num => {


y al hacer clic enter, REPL irá a una nueva línea con tres puntos al principio, lo que indica que puede continuar trabajando con el bloque de código:



... console.log(num)
... })


Si ingresa .breakal final, el modo de código de varias líneas se detendrá y la expresión no se ejecutará.



Pasar argumentos usando la línea de comando



Al iniciar una aplicación Node.js, puede pasarle cualquier número de argumentos.



Los argumentos pueden ser independientes o clave y valor.



Por ejemplo:



node app.js joe


o



node app.js name=joe 


La forma de recuperar el valor en el código Node.js depende de esto.



Un objeto incorporado se utiliza para recuperar valores process.



La propiedad de argveste objeto contiene una matriz de argumentos pasados ​​a través de la línea de comando.



El primer argumento es la ruta completa del comando node.



El segundo es la ruta completa del archivo ejecutable.



Los argumentos de interés para nosotros comienzan en la tercera posición (índice de matriz).



Puede iterar sobre los argumentos (incluida la ruta del nodo y la ruta del archivo) con un bucle:



process.argv.forEach((val, index) => {
    console.log(`${index}: ${val}`)
})


Los argumentos pasados ​​se pueden obtener creando una nueva matriz sin los dos primeros parámetros:



const args = process.argv.slice(2)


Si tenemos un argumento sin un índice (clave):



node app.js joe


podemos obtenerlo así:



const args = process.argv.slice(2)
args[0]


En este caso:



node app.js name=joe


args[0]- name=joees por eso que debemos analizarlo. La mejor manera de hacer esto es usar una biblioteca minimista diseñada para trabajar con argumentos:



const args = require('minimist')(process.argv.slice(2))
args['name'] // joe


Aquí debe usar un guión doble antes de cada argumento:



node app.js --name=joe


Salida de resultados a la línea de comando usando Node.js



Salida estándar a través del módulo console


Node.js proporciona un módulo de consola que contiene muchas formas muy útiles para interactuar con la línea de comandos.



Parece un objeto de consolenavegador.



Uno de los principales métodos de este módulo es console.log(), que imprime la cadena pasada a la consola.



Si pasa un objeto, se convertirá en una cadena.



Podemos pasar console.logvarias variables:



const x = 'x'
const y = 'y'
console.log(x, y)


y Node.js generará ambos.



También podemos formatear la cadena usando especificadores:



Por ejemplo:



console.log('My %s has %d years', 'cat', 2)


  • %s - formatea la variable como una cadena
  • %d - formatea la variable como un número
  • %i - convierte una variable en un entero
  • %o - formatea la variable como un objeto


Por ejemplo:



console.log('%o', Number)


Limpieza de la consola


console.clear() borra la consola (el comportamiento depende de la consola utilizada).



Elementos de conteo


console.count()Es un método conveniente.



Examina este código:



const x = 1 
const y = 2 
const z = 3
console.count(
    'The value of x is ' + x +
    ' and has been checked .. how many times?'
)
console.count(
    'The value of x is ' + x +
    ' and has been checked .. how many times?'
)
console.count(
    'The value of y is ' + y +
    ' and has been checked .. how many times?'
)


El contador cuenta el número de visualizaciones de línea y muestra este número.



The value of x is 1 and has been checked .. how many times?: 1
The value of x is 1 and has been checked .. how many times?: 2
The value of y is 2 and has been checked .. how many times?: 1  


Para que pueda contar la cantidad de manzanas y naranjas:



const oranges = ['orange', 'orange']
const apples = ['just one apple']
oranges.forEach(fruit => console.count(fruit))
apples.forEach(fruit => console.count(fruit))


Mostrar el seguimiento de la pila


Hay situaciones en las que necesita mostrar el seguimiento de la pila de una función, por ejemplo, para responder la pregunta "¿Cómo llegamos a este fragmento de código?"



Puedes hacerlo con console.trace():



const function2 = () => console.trace()
const function1 = () => function2()
function1()


Esto imprimirá un seguimiento de la pila en la consola. Esto es lo que vemos en la línea de comandos si ejecutamos el código anterior en el Node.js REPL:



Trace
    at function2 (repl:1:33)
    at function1 (repl:1:25)
    at repl:1:1
    at ContextifyScript.Script.runInThisContext (vm.js:44:33)
    at REPLServer.defaultEval (repl.js:239:29)
    at bound (domain.js:301:14)
    at REPLServer.runBound [as eval] (domain.js:314:12)
    at REPLServer.onLine (repl.js:440:10)
    at emitOne (events.js:120:20)
    at REPLServer.emit (events.js:210:7)


Contando el tiempo de ejecución del código


Puede calcular fácilmente cuánto tiempo se ha estado ejecutando una función time()y timeEnd():



const doSomething = () => console.log('test')
const measureDoingSomething = () => {
    console.time('doSomething()')
    //  -      
    doSomething()
    console.timeEnd('doSomething()')
}
measureDoingSomething()


stdout y stderr


Como sabemos, console.log es ideal para imprimir mensajes en la consola. Esto se llama salida estándar o stdout.



console.errorMuestra la secuencia stderr.



Este flujo no se envía a la consola, sino que se escribe en el registro de errores.



Estilo de salida


Puede colorear la salida de texto a la consola utilizando secuencias de escape . Estas secuencias son un conjunto de símbolos que identifican un color.



Por ejemplo:



console.log('\x1b[33m%s\x1b[0m', 'hi!')


Si escribe el código anterior en Node.js REPL, hi!será de color amarillo.



El método considerado es bastante laborioso. La forma más sencilla de colorear la salida de la consola es usar una biblioteca. Una de estas bibliotecas es Chalk , que, además de definir el color, le permite poner el texto en negrita, cursiva o subrayado.



Instale la biblioteca usando npm install chalky úsela de la siguiente manera:



const chalk = require('chalk')
console.log(chalk.yellow('hi!'))


El uso es chalk.yellowmucho más fácil que memorizar secuencias complejas. También hace que el código sea más legible.



Crear una barra de progreso


Progress es una gran biblioteca para crear indicadores de progreso en la terminal. Instalarlo con npm install progress.



Este fragmento crea una barra de progreso de 10 pasos. Se realiza un paso cada 100 ms. Al llenar el indicador, deshabilitamos el contador:



const ProgressBar = require('progress')

const bar = new ProgressBar(':bar', { total: 10 })
const timer = setInterval(() => {
    bar.tick()
    if (bar.complete) clearInterval(timer)
}, 100)


Gracias por su atención, amigos. Si encuentra errores y errores tipográficos, no dude en escribir en PM, se lo agradeceré.



Continuará…



All Articles