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





¡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.stdinlí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.



readlinecontiene 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 inquirery 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.jsubicado 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.exportsproporcionada por el sistema modular nos permite hacer .



Cuando asigna un objeto o función como una nueva propiedad del objetoexports, 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.exportsy 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


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



npmhace varias cosas



Una alternativa a npm es el hilo .



Cargando


npmgestiona la carga de dependencias del proyecto.



Si existe un archivo en el proyecto, el package.jsoninicio npm installinstalará todo lo que el proyecto requiera en el directorio node_modulesque 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.



npmverificará 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, npmsigue los estándares aceptados.



Ejecutando tareas


package.jsonadmite 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, npmpuede elegir entre dos tipos de instalación:



  • local
  • global


Por defecto, cuando ingresa, npm installpor ejemplo:



npm install lodash 


el paquete se instala en una carpeta node_modulesen el directorio actual.



Después de la instalación npmagrega un registro o lodasha la sección del dependenciesarchivo package.jsonen 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 nvmpara el control de versiones de Node.js.



¿Cómo uso los paquetes instalados?



Cómo usar un node_modulespaquete instalado en una carpeta o globalmente.



Digamos que instaló una lodashpopular biblioteca auxiliar de JavaScript con npm install lodash.



Este comando se instalará lodashen 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 .binestá oculta y contiene enlaces simbólicos a los datos binarios:







¿Cómo ejecutarlos?



Por supuesto, puede escribir ./node_modules/.bin/cowsayy debería funcionar, pero npx incluido con npm (desde 5.2) es la mejor opción. Solo lo hacesnpx cowsayy 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.jsonEs 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 npmy yarn).



Estructura de archivo


Aquí hay un ejemplo package.json:



{}


Como puede ver, está vacío. No package.jsonhay 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.jsontomado 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 / paquete
  • version - versión de la aplicación / paquete
  • description - una breve descripción de la aplicación / paquete
  • main - archivo principal (punto de entrada) de la aplicación
  • private- el valor trueevita la publicación accidental de la aplicación anpm
  • scripts - un conjunto de scripts (comandos) que se pueden ejecutar (ejecutar)
  • dependencies - dependencias del proyecto
  • devDependencies - dependencias del proyecto utilizadas solo durante el desarrollo
  • engines - versiones en las que se ejecuta la aplicación / paquete
  • browserlist - 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 npmse 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 npmpropiedad 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 trueevita 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 XXXXo yarn run XXXX, donde XXXXestá 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.jsonpuede contener propiedades especiales para herramientas como Babel, ESLint, etc.



Cada una de estas herramientas tiene sus propias propiedades, por ejemplo eslintConfig, babeletc. 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.0significa que solo se permiten actualizaciones de parches, es decir el lanzamiento es 0.13.1válido, pero el lanzamiento 0.14.0no es
  • ^- escribir ^0.13.0significa 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á…



All Articles