Guía de Node.js, Parte 3: Hosting, REPL, Operaciones de consola, Módulos

Aquí está la tercera parte de la traducción del manual Node.js. Hoy hablaremos sobre elegir un alojamiento para proyectos Node.js, cómo trabajar con Node.js en modo REPL y cómo ejecutar scripts con argumentos, cómo interactuar con la consola y los módulos.




Hosting para aplicaciones Node.js


La elección del alojamiento para aplicaciones Node.js depende de sus necesidades. Aquí hay una breve lista de opciones de alojamiento que puede explorar al decidir implementar su aplicación y ponerla a disposición del público. Primero, considere opciones simples, cuyas capacidades son limitadas, y luego más complejas, pero también con capacidades más serias.

▍ La opción de alojamiento más fácil: túnel local


Incluso si se asigna una dirección IP dinámica a su computadora o si está detrás de NAT, puede implementar su aplicación en ella y atender las solicitudes de los usuarios mediante un túnel local.

Esta opción es adecuada para organizar rápidamente las pruebas, para organizar una demostración del producto o para dar acceso a la aplicación a un grupo muy pequeño de personas.

Hay un muy buen servicio para organizar túneles locales, ngrok , disponible para muchas plataformas.

Usando ngrok, es suficiente ejecutar un comando de la forma ngrok PORT y el puerto que especificó será accesible desde Internet. Al mismo tiempo, si usa la versión gratuita del servicio, tendrá una dirección en el dominio ngrok.io . Si decide obtener una suscripción paga, puede usar sus propios nombres de dominio y, además, puede aumentar la seguridad de la solución (usando ngrok, abre el acceso a su computadora a través de Internet).

Otra herramienta que se puede utilizar para organizar túneles locales se llama localtunnel .

▍ Entornos para implementar proyectos de Node.js que no requieren configuración


Falla


Glitch es un entorno interactivo y una plataforma para el desarrollo rápido de aplicaciones que le permite implementarlos en los subdominios de glitch.com. Esta plataforma aún no admite sus propios dominios de usuario, existen algunas limitaciones al trabajar con ella, pero es excelente para trabajar en prototipos de aplicaciones. El diseño de Glitch se ve bastante divertido (tal vez esto se puede escribir en las ventajas de esta plataforma), pero este no es un tipo de entorno de "juguete" que es muy limitado. Aquí tiene la oportunidad de trabajar con Node.js, CDN, un repositorio seguro de información confidencial, la capacidad de intercambiar datos con GitHub y mucho más.

El proyecto Glitch está dirigido por la misma compañía detrás de FogBugz y Trello (uno de los creadores de StackOverflow). A menudo uso esta plataforma para demostrar aplicaciones.

Codepen


Codepen es una gran plataforma alrededor de la cual se ha formado una comunidad interesante. Aquí puede crear proyectos que incluyen muchos archivos e implementarlos utilizando su propio dominio.

▍ Entornos sin servidor


Las plataformas sin servidor le permiten publicar aplicaciones sin pensar completamente en los servidores, en configurarlos o en administrarlos. El paradigma de la informática sin servidor es que las aplicaciones se publican como funciones que responden a las llamadas a un punto final de la red. Un enfoque similar para la implementación de aplicaciones también se llama FAAS (Funciones como servicio, Función como servicio).

Aquí hay un par de soluciones populares en esta área:


Ambos proyectos proporcionan al desarrollador un cierto nivel de abstracción, que permite publicar aplicaciones en varias plataformas FAAS, por ejemplo, Amazon AWS Lambda, Microsoft Azure y Google Cloud.

▍ Soluciones PAAS


Las PAAS (Platform As A Service, Platform as a Service) son plataformas que se encargan de muchas cosas que, en circunstancias normales, deben ser atendidas por el desarrollador que implementa la aplicación.

Zeit Now


Zeit es una opción interesante para implementar aplicaciones. La implementación, utilizando esta plataforma, se reduce a ingresar el comando now en la terminal. Hay una versión gratuita de Zeit, hay algunas restricciones cuando se trabaja con él. También hay una versión paga y más potente de esta plataforma. Con Zeit, simplemente no puede pensar en el hecho de que su aplicación necesita un servidor. Simplemente despliega la aplicación, y todo lo demás es administrado por esta plataforma.

Nanobox


Los creadores de la plataforma Nanobox , que incluye la implementación de aplicaciones Node.js, lo llaman PAAS V2.

Heroku


Heroku es otra gran plataforma para alojar aplicaciones Node.js. Aquí hay un buen artículo sobre cómo trabajar con él.

Microsoft azure


Azure es una plataforma en la nube de Microsoft. Su documentación tiene una sección sobre aplicaciones Node.js.

Google Cloud Platform


Google Cloud es un excelente entorno para implementar aplicaciones Node.js. Aquí está la sección relevante de su documentación.

▍ Hosting VPS


Hay muchas plataformas que proporcionan servicios de alojamiento VPS . Una característica común de tales plataformas es el hecho de que el desarrollador tiene a su disposición un servidor virtual, instala independientemente un sistema operativo (Linux o Windows) en él e implementa aplicaciones de forma independiente.

Entre las plataformas que proporcionan servicios VPS, de las cuales hay muchas, podemos observar lo siguiente, que utilicé y que podría recomendar a otros:


Por nuestra cuenta, agregamos que RUVDS también proporciona servicios de alojamiento VPS. Tenemos licencia de FSTEC, nuestros clientes están asegurados por AIG, tenemos cuatro centros de datos en diferentes países. Hay su propio centro de datos RUCLOUD nivel TIER 3 en la ciudad de Korolev, región de Moscú, así como zonas de presión en los centros de datos Deltalis (Suiza) , London Equinix LD8 (Gran Bretaña) y MMTS-9 (Moscú, Rusia). Todas las zonas de contención cumplen con un nivel de confiabilidad de al menos TIER 3.

Los socios de la compañía son FINAM JSC, el grupo financiero BCS, el Depósito Nacional de Liquidación (Intercambio de Moscú), VTsIOM JSC, la compañía Gars-Telecom, el operador de taxi Gett, el operador de entrega de Delivery Club y muchos otros.


▍ Servidor normal


Otra solución de alojamiento es comprar (o alquilar, por ejemplo, utilizando el servicio Vultr Bare Metal ) un servidor normal, instalar Linux y otro software en él, conectarlo a Internet y alojar aplicaciones Node.js en él.

El alojamiento es un gran tema, pero, con suerte, los materiales de esta sección le permitirán elegir exactamente lo que necesita. Ahora pasamos a la historia sobre trabajar con Node.js en modo REPL.

Usando Node.js en modo REPL


La abreviatura REPL significa Read-Evaluate-Print-Loop (ciclo "leer - calcular - salida"). Usar REPL es una excelente manera de explorar rápidamente las capacidades de Node.js.

Como ya sabe, el comando de node se usa para ejecutar scripts en Node.js, se ve así:

 node script.js 

Si ingresa el mismo comando, pero no especifica un nombre de archivo, Node.js se iniciará en modo REPL:

 node 

Si intenta ingresar un comando de este tipo en su terminal, verá como resultado lo siguiente:

 > node > 

Node.js ahora está en modo de espera. El sistema espera que ingresemos un código JavaScript en la línea de comando que ejecutará.

Para comenzar, intentemos algo muy simple:

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

Aquí sugerimos que Node.js ejecute el comando utilizado para enviar datos a la consola. El primer valor, test , es lo que console.log('test') . El segundo valor, undefined , es el que devolvió la función console.log() .

Una vez que se completa el comando, aparece el mensaje REPL, lo que significa que podemos ingresar un nuevo comando aquí.

▍Completar comandos con la tecla Tab


REPL es un entorno interactivo. Si presiona la tecla Tab en su teclado mientras escribe código, REPL intentará completar automáticamente la entrada seleccionando, por ejemplo, un nombre adecuado para la variable que ya ha declarado o el nombre de un objeto estándar.

▍Explorando objetos JavaScript


Ingrese el nombre de algún objeto JavaScript estándar en la línea de comando, por ejemplo, Number , agregue un punto después y presione Tab .

REPL enumerará las propiedades y métodos del objeto con los que el desarrollador puede interactuar:


Examinando el objeto numérico

▍Explorar objetos globales


Para averiguar con qué objetos globales de Node.js puede trabajar, ingrese el comando global. en el terminal global. y presione Tab .


Investigación global de objetos

▍ Variable especial _


La variable _ (guión bajo) almacena el resultado de la última operación realizada. Esta variable se puede usar como parte de los comandos ingresados ​​en la consola.

▍ Comandos que comienzan con un punto


En el modo REPL, puede usar algunos comandos especiales que comienzan con un punto. Aquí están:

  • El comando .help muestra información de referencia para los comandos que comienzan con un punto.
  • El comando .editor sistema en modo editor, lo que facilita el ingreso de código JavaScript multilínea. Después de estar en este modo, ingresa todo lo que desea, para ejecutar el código, use el comando Ctrl+D
  • El comando .break permite cancelar la entrada de expresión de varias líneas. Su uso es similar al uso del método abreviado de teclado Ctrl+C
  • El comando .clear borra el contexto REPL y también interrumpe la entrada de una expresión de varias líneas.
  • El comando .load carga el código de un archivo JavaScript en la sesión actual.
  • El comando .save guarda todo lo que se ingresó durante la sesión REPL en el archivo.
  • El comando .exit permite salir de una sesión REPL; actúa como dos pulsaciones de tecla consecutivas de la combinación de teclas Ctrl+C

Cabe señalar que REPL reconoce la entrada de expresiones de varias líneas incluso sin usar el .editor .

Por ejemplo, comenzamos a ingresar un código iterador:

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

Si, después de ingresar la llave, presione la tecla Enter , REPL irá a una nueva línea, cuyo mensaje se verá como tres puntos. Esto indica que podemos ingresar el código para el bloque correspondiente. Se ve así:

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

Al presionar Enter después de ingresar el último paréntesis se ejecutará la expresión. Si ingresa .break en este modo, la entrada se cancelará y la expresión no se ejecutará.

El modo REPL es una característica útil de Node.js, pero su alcance se limita a pequeños experimentos. Estamos interesados ​​en algo más que la capacidad de ejecutar un par de comandos. Por lo tanto, pasamos a trabajar con Node.js en modo normal. A saber, hablemos sobre cómo los scripts Node.js pueden tomar argumentos de línea de comando.

Trabajar con argumentos de línea de comandos en scripts Node.js


Al ejecutar scripts Node.js, se les pueden pasar argumentos. Aquí hay una llamada de script regular:

 node app.js 

Los argumentos pasados ​​al script pueden ser valores independientes o construcciones clave-valor. En el primer caso, ejecutar el script se ve así:

 node app.js flavio 

En el segundo, así:

 node app.js name=flavio 

El método de pasar argumentos se usa para determinar cómo puede trabajar con ellos en el código del script.

Entonces, para acceder a los argumentos de la línea de comando, se usa el objeto de process estándar Node.js. Tiene la propiedad argv , que es una matriz que contiene, entre otras cosas, los argumentos pasados ​​al script al inicio.

El primer elemento de la matriz argv contiene la ruta completa al archivo que se ejecuta cuando se ingresa el comando de node en la línea de comando.

El segundo elemento es la ruta al ejecutable del script.

Todos los demás elementos de la matriz, comenzando desde el tercero, contienen lo que se pasó al script cuando se ejecutó.

La enumeración de argumentos disponibles en argv (esto incluye tanto la ruta al node como la ruta al archivo ejecutable del script) se puede organizar utilizando el bucle forEach :

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

Si no está interesado en los dos primeros argumentos, basándose en argv puede crear una nueva matriz que incluirá todo, desde argv excepto los dos primeros elementos:

 const args = process.argv.slice(2) 

Supongamos que, al ejecutar un script, solo se le pasa un argumento, en forma de un valor independiente:

 node app.js flavio 

Puede acceder a este argumento así:

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

Ahora intentemos usar una construcción de tipo clave-valor:

 node app.js name=flavio 

Con este enfoque, después de que se forma la matriz args , la cadena name=flavio en args[0] . Antes de usar el argumento, esta cadena debe analizarse. La forma más conveniente de hacer esto es usar la biblioteca minimista , que está diseñada para facilitar el trabajo con argumentos de línea de comandos:

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

Ahora considere la salida a la consola.

Salida de datos a la consola usando el módulo de consola


El módulo de consola estándar de Node.js brinda al desarrollador muchas oportunidades para interactuar con la línea de comandos durante la ejecución del programa. En general, esto es lo mismo que el objeto de console utilizado en JavaScript basado en navegador. Quizás el método más simple y más utilizado del módulo de console.log() es console.log() , que se utiliza para enviar datos de cadena a la consola. Además, si le pasa un objeto, entonces, antes de la salida, se convertirá en su representación de cadena.

El método console.log() puede pasar varios valores:

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

Después de ejecutar esta secuencia de instrucciones, tanto el valor x como el valor y llegarán a la consola.

Para formar cadenas complejas, el comando console.log() admite el uso de comodines, que, al generar datos, se reemplazan con sus valores correspondientes en orden de prioridad.

Por ejemplo, aquí hay un comando que muestra el texto My cat has 2 years :

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

Considere las características de los comodines:

  • %s formatea el valor como una cadena.
  • %d %i formatea el valor como un entero.
  • %f formatea el valor como un número de punto flotante.
  • %O utiliza para mostrar representaciones en cadena de objetos.

Aquí hay otro ejemplo de uso de comodines:

 console.log('%O', Number) 

▍Limpieza de la consola


Para borrar la consola, use el comando console.clear() (su comportamiento en diferentes terminales puede variar).

▍ Elementos de conteo


Ahora veremos el útil método console.count() . Echa un vistazo a 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 método count() cuenta el número de salidas de fila y muestra el resultado junto a ellas.
Con este método, en el siguiente ejemplo, puede contar manzanas y naranjas:

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

▍Muestra de resultados de seguimiento de pila a la consola


A veces es útil imprimir un rastro de la pila de funciones en la consola. Por ejemplo, para responder a la pregunta de cómo llegamos a cierto lugar en el programa. Puede hacer esto con el siguiente comando:

 console.trace() 

Aquí hay un ejemplo de su uso:

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

Esto es lo que sucedió cuando ejecuté este código en modo 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) 

▍Medir el tiempo necesario para completar una acción


Puede medir el tiempo que lleva, por ejemplo, ejecutar una función, utilizando los métodos console.time() y console.timeEnd() . Se ve así:

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

▍Trabajar con stdout y stderr


Como hemos visto, el comando console.log() es excelente para enviar mensajes a la consola. Cuando se usa, se usa el llamado flujo de salida estándar, o stdout .

El comando console.error() volca los datos en la secuencia de error estándar, stderr . Los datos enviados a stderr a la consola, aunque lo que se envía a este flujo puede, por ejemplo, redirigirse al archivo de registro de errores.

▍Utilice el color cuando envíe datos a la consola


Para colorear los textos que se muestran en la consola, puede usar secuencias de escape que identifiquen los colores:

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

Si ejecuta este comando, por ejemplo, en modo REPL, el texto hi se mostrará en amarillo.
Este enfoque, sin embargo, no es particularmente conveniente. Será conveniente utilizar una biblioteca especializada, por ejemplo, tiza, para mostrar texto en color en la consola . Esta biblioteca, además del formato de color de los textos, admite otras formas de diseñarlos. Por ejemplo, con su ayuda es posible hacer que el texto esté en negrita, cursiva o subrayado.

Para instalarlo desde npm, use el siguiente comando:

 npm install chalk 

Puedes usarlo así:

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

Usar el chalk.yellow() es mucho más conveniente que las secuencias de escape, y el texto del programa con este enfoque es mucho más fácil de leer.

Para obtener más información sobre tiza, consulte esta página de la biblioteca en GitHub.

▍ Crear una barra de progreso


La barra de progreso puede ser útil en diferentes situaciones. Puede usar el paquete de progreso para crear indicadores de progreso que se ejecutan en la consola. Puedes instalarlo así:

 npm install progress 

A continuación se muestra un ejemplo de código en el que se crea un indicador que se puede utilizar para mostrar información sobre una tarea que consta de 10 pasos. En nuestro caso, se requieren 100 ms para completar cada paso. Una vez que el indicador está lleno, se clearItnerval() comando clearItnerval() y el programa finaliza.

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

▍ Recepción de la entrada del usuario desde la línea de comando


¿Cómo hacer que las aplicaciones de línea de comandos escritas para la plataforma Node.js sean interactivas? A partir de la versión 7, Node.js contiene un módulo de línea de lectura que le permite recibir datos de secuencias que se pueden leer, por ejemplo, de process.stdin . Este hilo, durante la ejecución del programa Node.js, es lo que se ingresa en el terminal. Los datos se ingresan una línea a la vez.

Considere el siguiente fragmento de código:

 const readline = require('readline').createInterface({ input: process.stdin, output: process.stdout }) readline.question(`What's your name?`, (name) => { console.log(`Hi ${name}!`) readline.close() }) 

Aquí le preguntamos al usuario su nombre, y después de ingresar el texto y presionar la tecla Enter en el teclado, mostramos un saludo.

El método question() muestra lo que se le pasa como primer parámetro (es decir, la pregunta que se le hace al usuario) y espera a que se complete la entrada. Después de presionar Enter llama a la devolución de llamada que se le pasó en el segundo parámetro y procesa lo que se ingresó. En la misma devolución de llamada, readline interfaz readline .

readline , , .

, , , , , , — * .

, readline-sync , , readline , .

, . inquirer . :

 npm install inquirer 

:

 const inquirer = require('inquirer') var questions = [{ type: 'input', name: 'name', message: "What's your name?", }] inquirer.prompt(questions).then(answers => { console.log(`Hi ${answers['name']}!`) }) 

inquirer . , .

Node.js. readline , readline-sync inquirer. , , .

Node.js, exports


, API module.exports , . Node.js , . , require , :

 const library = require('./library') 

library.js , , , .

, , - , . , , . , API module.exports , .

.

module.exports , , . :

 const car = { brand: 'Ford', model: 'Fiesta' } module.exports = car //..   const car = require('./car') 

, exports . , , — :

 const car = { brand: 'Ford', model: 'Fiesta' } exports.car = car 

:

 exports.car = { brand: 'Ford', model: 'Fiesta' } 

, , :

 const items = require('./items') items.car 

:

 const car = require('./items').car 

module.exports exports ?

, module.exports . .


Node.js-, REPL, , Node.js. npm, , , package.json package-lock.json .

Estimados lectores! Node.js-?

Source: https://habr.com/ru/post/es423701/


All Articles