¡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
Obtener datos ingresados por el usuario en Node.js
¿Cómo hago que un programa Node.js sea interactivo?
Para hacer esto, la versión 7 de Node.js presenta el módulo readline : se usa para obtener datos de una secuencia para leer, como la
process.stdin
línea de comando durante la ejecución de un programa Node.js.
const readline = require('readline').createInterface({
input: process.stdin,
output: process.stdout
})
readline.question(`What is your name?`, name => {
console.log(`Hi ${name}!`)
readline.close()
})
Este código solicita el nombre de usuario, después de que el usuario ha escrito y hecho clic
enter
, se muestra un saludo.
El método
question()
imprime el primer parámetro (pregunta) en la consola y espera la respuesta del usuario. Cuando se presiona enter
, se ejecuta la función de devolución de llamada.
En esta devolución de llamada, cerramos la interfaz
readline
.
readline
contiene otros métodos, sobre los cuales puede leer en la documentación.
Si necesita solicitar una contraseña, es mejor no devolverla explícitamente, sino usar símbolos
*
.
Una forma de hacerlo es usar el paquete readline-sync , que es simple de entender y fácil de configurar.
El paquete Inquirer.js proporciona una solución más completa y abstracta .
Lo instalamos con la ayuda
npm install inquirer
y lo usamos de la siguiente manera:
const inquirer = require('inquirer')
const questions = [
{
type: 'input',
name: 'name',
message: `What's your name?`
}
]
inquirer.prompt(questions).then(answers => {
console.log(`Hi ${answers['name']}!`)
})
Inquirer.js le permite hacer muchas cosas interesantes, como sugerir múltiples opciones, proporcionar botones de radio, solicitar confirmación, etc.
Es mejor conocido como una alternativa a las soluciones integradas, pero si planea llevar la experiencia del usuario al siguiente nivel, Inquirer.js es la mejor solución.
Extender la funcionalidad del archivo Node.js utilizando Exportar
Node.js tiene un sistema modular incorporado.
El archivo Node.js puede importar la funcionalidad de otros archivos Node.js.
Cuando desea importar algo que utiliza
const library = require('./library')
para importar la funcionalidad exportada en un archivo
library.js
ubicado en el directorio actual.
En este archivo, la funcionalidad debe exportarse antes de poder importarse en otro archivo.
Cualquier otro objeto o variable definida en un archivo es por defecto privado (privado) y no puede usarse en otros archivos.
Esto es lo que la interfaz
module.exports
proporcionada por el sistema modular nos permite hacer .
Cuando asigna un objeto o función como una nueva propiedad del objeto
exports
, los exporta y luego se pueden importar a otra parte de la aplicación o en otra aplicación.
Esto se puede hacer de dos maneras.
La primera forma es asignar un valor
module.exports
, que es el objeto predeterminado proporcionado por el sistema modular. Este método le permite exportar solo este objeto:
const car = {
brand: 'Ford',
model: 'Fiesta'
}
module.exports = car
//
const car = require('./car')
La segunda forma es agregar el objeto exportado como una propiedad del objeto
exports
. Este método le permite exportar muchos objetos, funciones o datos:
const car = {
brand: 'Ford',
model: 'Fiesta'
}
exports.car = car
más o menos
exports.car = {
brand: 'Ford',
model: 'Fiesta'
}
Para usar este objeto en otro archivo, debe hacer un enlace a la importación:
const items = require('./items')
items.car
o
const car = require('./items').car
¿Cuál es la diferencia entre
module.exports
y exports
?
El primero exporta el objeto referenciado, el segundo una propiedad del objeto.
Una introducción al administrador de paquetes npm
Introducción a npm
npm
Es el administrador de paquetes predeterminado de Node.js.
A partir de enero de 2017, npm tenía más de 350,000 paquetes, por lo que es el repositorio de código más grande en un solo lenguaje de programación en la Tierra, y puede estar seguro de que hay paquetes para hacer casi cualquier cosa.
Todo comenzó con la descarga y administración de dependencias en Node.js, pero pronto esta herramienta comenzó a usarse activamente en el desarrollo del lado del cliente de las aplicaciones.
npm
hace varias cosas
Una alternativa a npm es el hilo .
Cargando
npm
gestiona la carga de dependencias del proyecto.
Si existe un archivo en el proyecto, el
package.json
inicio npm install
instalará todo lo que el proyecto requiera en el directorio node_modules
que se crea si no existe.
Se puede instalar un paquete específico usando
npm install <package-name>
.
A menudo, la instalación de un paquete se acompaña de banderas:
- --save - instala el paquete y agrega una entrada al respecto a la sección de dependencias del archivo
package.json
- --save-dev: instala el paquete y agrega una entrada al respecto en la sección devDependencies del archivo
package.json
La principal diferencia es que devDependencies se usa para fines de desarrollo como pruebas, mientras que las dependencias se usan en producción (al construir un proyecto).
Actualizando paquetes
La actualización es fácil con
npm update
.
npm
verificará todos los paquetes en busca de nuevas versiones que cumplan con las restricciones establecidas.
También puede actualizar un paquete específico:
npm update <package-name>
.
Versionado
Además de las descargas estándar, npm admite el control de versiones, por lo que puede especificar cualquier versión específica de un paquete o solicitar una versión más nueva o más antigua.
A menudo encontrará que una biblioteca solo es compatible con una determinada versión (principal) de otra biblioteca.
Y también con los errores de los últimos lanzamientos que no se han solucionado durante mucho tiempo.
El control de versiones también ayuda al desarrollo del equipo porque cada miembro del equipo sabe qué versión usar antes de actualizar el archivo
package.json
.
En todos estos casos, el control de versiones ayuda; en este sentido,
npm
sigue los estándares aceptados.
Ejecutando tareas
package.json
admite un formato para especificar comandos que se ejecutarán en el terminal con npm run <task-name>
.
Por ejemplo:
{
"scripts": {
"start-dev": "node lib/server-development",
"start": "node lib/server-production"
},
}
Es una práctica común usar esta capacidad para ejecutar Webpack:
{
"scripts": {
"watch": "webpack --watch --progress --colors --config webpack.conf.js",
"dev": "webpack --progress --colors --config webpack.conf.js",
"prod": "NODE_ENV=production webpack -p --config webpack.conf.js"
},
}
Esto permite, en lugar de un conjunto de comandos largos que son fáciles de olvidar o que son fáciles de cometer errores, hacer esto:
npm run watch
npm run dev
npm run prod
¿Dónde instala npm paquetes?
Al instalar paquetes usando,
npm
puede elegir entre dos tipos de instalación:
- local
- global
Por defecto, cuando ingresa,
npm install
por ejemplo:
npm install lodash
el paquete se instala en una carpeta
node_modules
en el directorio actual.
Después de la instalación
npm
agrega un registro o lodash
a la sección del dependencies
archivo package.json
en el directorio actual.
Para una instalación global, use la bandera
-g
:
npm install -g lodash
En una instalación global, el paquete se instala no en el directorio actual, sino en el global.
¿Pero dónde exactamente?
Para determinar esto, debe ejecutar el comando
npm root -g
.
En macOS o Linux, este directorio puede ser
/usr/local/lib/node_modules
. En Windows - C:\Users\YOU\AppData\Roaming\npm\node_modules
. Este directorio puede ser diferente
cuando se usa
nvm
para el control de versiones de Node.js.
¿Cómo uso los paquetes instalados?
Cómo usar un
node_modules
paquete instalado en una carpeta o globalmente.
Digamos que instaló una
lodash
popular biblioteca auxiliar de JavaScript con npm install lodash
.
Este comando se instalará
lodash
en un directorio local node_modules
.
Para usar el programa, debe importar el paquete usando
require
:
const _ = require('lodash')
¿Qué pasa si el paquete es ejecutable (archivo)?
En este caso, el archivo ejecutable se colocará en el directorio
node_modules/.bin/
.
Esto se puede demostrar fácilmente utilizando la biblioteca cowsay .
Este paquete proporciona un programa de línea de comando, cuando se ejecuta, la vaca (y otros animales) "habla" algo.
Al instalar un paquete a través de
npm install cowsay
, se instalarán el paquete en sí y varias de sus dependencias:
la carpeta
.bin
está oculta y contiene enlaces simbólicos a los datos binarios:
¿Cómo ejecutarlos?
Por supuesto, puede escribir
./node_modules/.bin/cowsay
y debería funcionar, pero npx incluido con npm (desde 5.2) es la mejor opción. Solo lo hacesnpx cowsay
y npx localizará el archivo automáticamente: la
vaca dice " sácame de aquí".
Package.json manual
Cuando trabaje con JavaScript, cuando interactúe con un proyecto de JavaScript, Node.js o el front-end de una aplicación, es probable que encuentre a
package.json
.
¿Lo que es? ¿Qué debes saber sobre él? ¿Y qué puedes hacer con él?
package.json
Es una especie de manifiesto del proyecto. Él puede hacer muchas cosas que no están relacionadas entre sí. Por ejemplo, puede ser el archivo principal para la configuración de las herramientas utilizadas. También almacena los nombres y versiones de todos los paquetes instalados (esta información se utiliza npm
y yarn
).
Estructura de archivo
Aquí hay un ejemplo
package.json
:
{}
Como puede ver, está vacío. No
package.json
hay requisitos para el contenido . El único requisito es su formato (JSON), de lo contrario, los programas no podrán acceder a él.
Si está creando un paquete Node.js a través del cual planea distribuirlo
npm
, la situación cambia drásticamente y necesita agregar propiedades para ayudar a otras personas a usar el paquete. Veremos esto más tarde.
Aquí hay otro ejemplo
package.json
:
"name": "test-project"
Aquí hemos definido el nombre del paquete o aplicación ubicado en el mismo directorio que
package.json
.
Aquí hay un ejemplo de uno más complejo
package.json
tomado de una aplicación Vue.js:
{
"name": "test-project",
"version": "1.0.0",
"description": "A Vue.js project",
"main": "src/main.js",
"private": true,
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
"unit": "jest --config test/unit/jest.conf.js --coverage",
"test": "npm run unit",
"lint": "eslint --ext .js,.vue src test/unit",
"build": "node build/build.js"
},
"dependencies": {
"vue": "^2.5.2"
},
"devDependencies": {
"autoprefixer": "^7.1.2",
"babel-core": "^6.22.1",
"babel-eslint": "^8.2.1",
"babel-helper-vue-jsx-merge-props": "^2.0.3",
"babel-jest": "^21.0.2",
"babel-loader": "^7.1.1",
"babel-plugin-dynamic-import-node": "^1.2.0",
"babel-plugin-syntax-jsx": "^6.18.0",
"babel-plugin-transform-es2015-modules-commonjs": "^6.26.0",
"babel-plugin-transform-runtime": "^6.22.0",
"babel-plugin-transform-vue-jsx": "^3.5.0",
"babel-preset-env": "^1.3.2",
"babel-preset-stage-2": "^6.22.0",
"chalk": "^2.0.1",
"copy-webpack-plugin": "^4.0.1",
"css-loader": "^0.28.0",
"eslint": "^4.15.0",
"eslint-config-airbnb-base": "^11.3.0",
"eslint-friendly-formatter": "^3.0.0",
"eslint-import-resolver-webpack": "^0.8.3",
"eslint-loader": "^1.7.1",
"eslint-plugin-import": "^2.7.0",
"eslint-plugin-vue": "^4.0.0",
"extract-text-webpack-plugin": "^3.0.0",
"file-loader": "^1.1.4",
"friendly-errors-webpack-plugin": "^1.6.1",
"html-webpack-plugin": "^2.30.1",
"jest": "^22.0.4",
"jest-serializer-vue": "^0.3.0",
"node-notifier": "^5.1.2",
"optimize-css-assets-webpack-plugin": "^3.2.0",
"ora": "^1.2.0",
"portfinder": "^1.0.13",
"postcss-import": "^11.0.0",
"postcss-loader": "^2.0.8",
"postcss-url": "^7.2.1",
"rimraf": "^2.6.0",
"semver": "^5.3.0",
"shelljs": "^0.7.6",
"uglifyjs-webpack-plugin": "^1.1.1",
"url-loader": "^0.5.8",
"vue-jest": "^1.0.2",
"vue-loader": "^13.3.0",
"vue-style-loader": "^3.0.1",
"vue-template-compiler": "^2.5.2",
"webpack": "^3.6.0",
"webpack-bundle-analyzer": "^2.9.0",
"webpack-dev-server": "^2.9.1",
"webpack-merge": "^4.1.0"
},
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
},
"browserslist": ["> 1%", "last 2 versions", "not ie <= 8"]
}
Hay mucho aquí:
name
- nombre de la aplicación / paqueteversion
- versión de la aplicación / paquetedescription
- una breve descripción de la aplicación / paquetemain
- archivo principal (punto de entrada) de la aplicaciónprivate
- el valortrue
evita la publicación accidental de la aplicación anpm
scripts
- un conjunto de scripts (comandos) que se pueden ejecutar (ejecutar)dependencies
- dependencias del proyectodevDependencies
- dependencias del proyecto utilizadas solo durante el desarrolloengines
- versiones en las que se ejecuta la aplicación / paquetebrowserlist
- navegadores compatibles (y sus versiones)
Se utilizan todas estas propiedades
npm
.
Propiedades
En esta sección, hablaremos sobre algunas de las propiedades que puede usar. Usaremos el término "paquete", pero la mayor parte de lo que se ha dicho también es cierto para las aplicaciones.
La mayoría de las propiedades son necesarias para publicar el paquete
npm
, algunas para interactuar con el paquete.
Nombre nombre)
Especifica el nombre del paquete.
Por ejemplo:
"name": "test-project"
El nombre no debe exceder los 214 caracteres, no debe contener espacios y solo puede consistir en letras minúsculas (minúsculas), guiones (-) y guiones bajos (_).
Esto se debe a que
npm
se asigna una URL al paquete cuando se publica en función de su nombre.
Si el paquete se publica en GitHub, es una buena práctica vincular al repositorio.
Autor
Identifica al autor del paquete.
Por ejemplo:
{
"author": "Joe <joe@whatever.com> (https://whatever.com)"
}
o así:
{
"author": {
"name": "Joe",
"email": "joe@whatever.com",
"url": "https://whatever.com"
}
}
Contribuyentes
Especifica uno o más contribuyentes al paquete. Esta propiedad es una serie de cadenas.
Por ejemplo:
{
"contributors": ["Joe <joe@whatever.com> (https://whatever.com)"]
}
o así:
{
"contributors": [
{
"name": "Joe",
"email": "joe@whatever.com",
"url": "https://whatever.com"
}
]
}
Errores
Define un enlace a un rastreador de problemas, generalmente un rastreador de problemas en GitHub.
Por ejemplo:
{
"bugs": "https://github.com/whatever/package/issues"
}
Página principal
Define la dirección de la página de inicio.
Por ejemplo:
{
"homepage": "https://whatever.com/package"
}
Versión
Determina la versión actual del paquete.
Por ejemplo:
"version": "1.0.0"
Esta propiedad sigue el estándar de versiones semánticas. Esto significa que siempre debe constar de tres números separados por puntos
x.x.x
.
El primer número es la versión principal, el segundo es la versión menor, el tercero es el parche.
Cada número tiene un significado específico: una actualización para corregir errores es un parche, una versión de cambios compatibles con versiones anteriores es una versión menor, y una versión principal puede significar cambios que son incompatibles con la versión anterior.
Licencia
Especifica la licencia para el paquete.
Por ejemplo:
"license": "MIT"
Palabras clave
Esta propiedad es una matriz de palabras clave asociadas con el paquete.
Por ejemplo:
"keywords": [
"email",
"machine learning",
"ai"
]
Ayudan a las personas a encontrar paquetes.
Descripción
Define una breve descripción para el paquete.
Por ejemplo:
"description": "A package to work with strings"
Al publicar un paquete en una
npm
propiedad determinada, ayuda a las personas a comprender para qué sirve.
Repositorio
Determina dónde se encuentra el código fuente del paquete.
Por ejemplo:
"repository": "github:whatever/testing",
Presta atención al prefijo
github
. Hay otros servicios similares:
"repository": "gitlab:whatever/testing",
"repository": "bitbucket:whatever/testing",
También puede definir un sistema de control de versiones:
"repository": {
"type": "git",
"url": "https://github.com/whatever/testing.git"
}
Puede especificar múltiples sistemas de control de versiones:
"repository": {
"type": "svn",
"url": "..."
}
principal
Define el archivo principal (punto de entrada) para el paquete.
Al importar un paquete a una aplicación, es en este archivo donde la aplicación buscará los módulos exportados.
Por ejemplo:
"main": "src/main.js"
privado
Establecer esta propiedad en un valor
true
evita que el paquete se publique accidentalmente en npm
.
Por ejemplo:
"private": true
guiones
Define una lista de comandos (scripts) que se pueden ejecutar (ejecutar).
Por ejemplo:
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
"unit": "jest --config test/unit/jest.conf.js --coverage",
"test": "npm run unit",
"lint": "eslint --ext .js,.vue src test/unit",
"build": "node build/build.js"
}
Estas secuencias de comandos son aplicaciones de línea de comandos. Puede ejecutarlos con
npm run XXXX
o yarn run XXXX
, donde XXXX
está el nombre del comando. Por ejemplo: npm run dev
.
Puede usar cualquier nombre como nombre del comando, el script hará lo que especifique en él.
Dependencias
Define una lista de dependencias de paquetes.
Al instalar un paquete usando npm o hilo:
npm install <PACKAGENAME>
yarn add <PACKAGENAME>
El registro de este paquete se agregará automáticamente a la propiedad en cuestión.
Por ejemplo:
"dependencies": {
"vue": "^2.5.2"
}
devDependencies
Define una lista de dependencias para fines de desarrollo.
Difieren de
dependencies
, ya que se instalan solo en la computadora del desarrollador y no entran en producción.
Al instalar un paquete usando npm o hilo:
npm install --save-dev <PACKAGENAME>
yarn add --save-dev <PACKAGENAME>
el registro al respecto se agrega automáticamente a la propiedad considerada.
Por ejemplo:
"devDependencies": {
"autoprefixer": "^7.1.2",
"babel-core": "^6.22.1"
}
motores
Determina en qué versiones de Node.js u otras herramientas se está ejecutando el paquete / aplicación.
Por ejemplo:
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0",
"yarn": "^0.13.0"
}
lista de navegadores
Define una lista de navegadores compatibles (y sus versiones). Babel, Autoprefixer y otras herramientas utilizan esta información para crear polyfills y garantizar la compatibilidad con los navegadores especificados.
Por ejemplo:
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
Esta configuración significa que desea admitir las dos últimas versiones de todos los navegadores que más del 1% de las personas usan de acuerdo con las estadísticas de CanIUse , con la excepción de IE8 y versiones anteriores.
Propiedades especiales
package.json
puede contener propiedades especiales para herramientas como Babel, ESLint, etc.
Cada una de estas herramientas tiene sus propias propiedades, por ejemplo
eslintConfig
, babel
etc. Para obtener detalles sobre propiedades especiales, consulte la documentación correspondiente.
Versiones del paquete
En los ejemplos anteriores, probablemente haya notado entradas como esta:
~3.0.0
, ^0.13.0
. ¿Qué quieren decir? ¿Y qué otros especificadores de versión puedo usar?
Estos especificadores se utilizan para definir condiciones de actualización.
Las reglas son las siguientes:
~
- escribir~0.13.0
significa que solo se permiten actualizaciones de parches, es decir el lanzamiento es0.13.1
válido, pero el lanzamiento0.14.0
no es^
- escribir^0.13.0
significa que se permiten parches y actualizaciones menores*
- registro*
significa que se permiten actualizaciones>
- se permiten nuevas versiones>=
- Se permiten versiones similares o más nuevas<=
- Se aceptan versiones similares o anteriores<
- cualquier versión anterior está permitida
Aquí hay un par de reglas más:
- sin caracteres principales: solo se permite la versión especificada
latest
- solo se permite la última versión
Estos caracteres se pueden combinar de varias maneras, por ejemplo:
1.0.0 || >=1.1.0 <1.2.0
.
Gracias por su atención.
Continuará…