Hoy publicamos la cuarta parte de la traducción de Node.js. En este artículo, comenzaremos a hablar sobre npm y también consideraremos las características de los
package-lock.json
package.json
y
package-lock.json
.

[Le aconsejamos que lea] Otras partes del cicloParte 1:
Información general y primeros pasosParte 2:
JavaScript, V8, algunos trucos de desarrolloParte 3:
Hosting, REPL, trabajar con la consola, módulosParte 4:
archivos npm, package.json y package-lock.jsonParte 5:
npm y npxParte 6:
bucle de eventos, pila de llamadas, temporizadoresParte 7:
Programación asincrónicaParte 8:
Guía de Node.js, Parte 8: Protocolos HTTP y WebSocketParte 9:
Guía de Node.js, parte 9: trabajar con el sistema de archivosParte 10:
Guía de Node.js, Parte 10: Módulos estándar, flujos, bases de datos, NODE_ENVPDF completo de la guía Node.js Npm básicos
Npm (administrador de paquetes de nodo) es el administrador de paquetes de Node.js. En la primera parte de este material, ya mencionamos que ahora en npm hay más de medio millón de paquetes, lo que lo convierte en el repositorio de código más grande del mundo escrito en un idioma. Esto sugiere que en npm puede encontrar paquetes diseñados para resolver casi cualquier tarea.
Inicialmente, npm se creó como un sistema de gestión de paquetes para Node.js, pero hoy también se usa para desarrollar proyectos front-end en JavaScript. Para interactuar con el registro npm, se usa el comando del mismo nombre, lo que le brinda al desarrollador una gran cantidad de oportunidades.
▍ Cargar paquetes
Con el comando
npm
, puede descargar paquetes del registro. A continuación consideraremos ejemplos de su uso.
▍Instalar todas las dependencias del proyecto
Si el proyecto tiene un archivo
package.json
, puede instalar todas las dependencias de este proyecto con el siguiente comando:
npm install
Este comando descargará todo lo que el proyecto necesita y colocará estos materiales en la carpeta
node_modules
, creándolo si no existe en el directorio del proyecto.
▍Instalar un paquete separado
Se puede instalar uno separado con el siguiente comando:
npm install <package-name>
A menudo puede ver cómo se usa este comando no de una forma tan simple, sino con algunas banderas. Considéralos:
- El indicador
--save
permite instalar un paquete y agregar una entrada al respecto a la sección de dependencies
del archivo package.json
, que describe las dependencias del proyecto. El proyecto utiliza estas dependencias para implementar su funcionalidad principal, se instalan durante su implementación en el servidor (después del lanzamiento de npm 5, las entradas sobre los paquetes instalados en la sección de dependencias se realizan automáticamente y sin usar este indicador). - El
--save-dev
permite instalar el paquete y agregar una entrada al respecto a la sección que contiene una lista de dependencias de desarrollo (es decir, paquetes que se necesitan durante el desarrollo del proyecto, como bibliotecas para pruebas, pero no son necesarios para su funcionamiento) del archivo package.json
llamado devDependencies
.
▍ Actualización de paquete
Para actualizar paquetes, use el siguiente comando:
npm update
Después de recibir este comando, npm verificará todos los paquetes para sus nuevas versiones, y si encuentran sus nuevas versiones que cumplen con las restricciones de versión de paquete especificadas en
package.json
, instálelas.
También puede actualizar un paquete separado:
npm update <package-name>
▍ Subir paquetes de ciertas versiones
Además de las descargas de paquetes estándar, npm también admite la descarga de versiones específicas de ellos. En particular, se puede observar que algunas bibliotecas solo son compatibles con ciertas versiones grandes de otras bibliotecas, es decir, si las dependencias de dichas bibliotecas se instalaran sin considerar las versiones, esto podría interrumpir su trabajo. La capacidad de instalar una versión específica de un paquete es útil en situaciones donde, por ejemplo, la última versión de este paquete es bastante adecuada para usted, pero resulta que hay un error. A la espera del lanzamiento de una versión fija del paquete, puede usar su versión anterior pero estable.
La capacidad de especificar versiones específicas de las bibliotecas requeridas por el proyecto es útil en el desarrollo del equipo cuando todos los miembros del equipo usan exactamente las mismas bibliotecas. La transición a sus nuevas versiones también se lleva a cabo de forma centralizada, haciendo cambios en el archivo del proyecto
package.json
.
En todos estos casos, la capacidad de especificar las versiones de paquete requeridas por el proyecto es extremadamente útil. Npm sigue el estándar de versiones semánticas (semver).
▍ Ejecutar guiones
El archivo
package.json
admite la capacidad de describir comandos (scripts) que se pueden iniciar con esta construcción:
npm <task-name>
Por ejemplo, así es como se ve la lista de scripts en la sección correspondiente del archivo:
{ "scripts": { "start-dev": "node lib/server-development", "start": "node lib/server-production" } }
Es muy común usar esta función para iniciar 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", } }
Este enfoque permite reemplazar la entrada de comandos largos, cargados de errores, con las siguientes construcciones simples:
$ npm watch $ npm dev $ npm prod
▍ ¿Dónde instala npm los paquetes?
Al instalar paquetes usando npm (o
hilo ), hay dos opciones de instalación disponibles: local y global.
De manera predeterminada, cuando usa un comando como
npm install lodash
, el paquete aparece en la carpeta
node_modules
ubicada en la carpeta del proyecto. Además, si se ejecutó el comando anterior, npm también agregará una entrada para la biblioteca
lodash
a la sección de
dependencies
del archivo
package.json
, que se encuentra en el directorio actual.
La instalación global de paquetes se realiza utilizando el indicador
-g
:
npm install -g lodash
Al ejecutar dicho comando, npm no instala el paquete en la carpeta local del proyecto. En su lugar, copia los archivos del paquete en alguna ubicación global. ¿A dónde van exactamente estos archivos?
Para averiguarlo, use el siguiente comando:
npm root -g
En macOS o Linux, los archivos de paquete pueden aparecer en el
/usr/local/lib/node_modules
. En Windows, podría ser algo así como
C:\Users\YOU\AppData\Roaming\npm\node_modules
.
Sin embargo, si usa Node.js nvm para el control de versiones, la ruta a la carpeta del paquete global puede cambiar.
Por ejemplo, uso nvm, y el comando anterior me dice que los paquetes globales están instalados en esta dirección:
/Users/flavio/.nvm/versions/node/v8.9.0/lib/node_modules
.
▍Utilice y ejecute paquetes instalados con npm
¿Cómo usar módulos instalados usando npm, local o globalmente, que caen en las carpetas
node_modules
? Supongamos que instaló la popular biblioteca
lodash
, que contiene muchas funciones auxiliares utilizadas en el desarrollo de JavaScript:
npm install lodash
Tal comando instalará la biblioteca en la carpeta local del proyecto
node_modules
.
Para usarlo en su código, simplemente impórtelo usando el comando
require
:
const _ = require('lodash')
¿Qué pasa si el paquete es un archivo ejecutable?
En este caso, el archivo ejecutable
node_modules/.bin/ folder
en la
node_modules/.bin/ folder
.
Puede ver cómo funciona este mecanismo instalando el paquete
cowsay . Es un programa cómico escrito para la línea de comando. Si pasa algún texto a este paquete, en la consola, al estilo del arte ASCII, se mostrará una imagen de una vaca que "pronuncia" el texto correspondiente. Otras criaturas pueden "expresar" el texto.
Entonces, después de instalar el paquete usando el
npm install cowsay
, junto con sus dependencias,
node_modules
en
node_modules
. Y en la carpeta oculta
.bin
se escribirán enlaces simbólicos a los archivos binarios de cowsay.
¿Cómo llevarlos a cabo?
Por supuesto, puede ingresar algo como
./node_modules/.bin/cowsay
en la terminal para llamar al programa, este es un enfoque funcional, pero es mucho mejor usar
npx , una herramienta para iniciar ejecutables de paquetes npm, incluidos en npm desde la versión 5.2. A saber, en nuestro caso, necesitamos el siguiente comando:
npx cowsay
La ruta al paquete npx se encontrará automáticamente.
Archivo Package.json
El archivo
package.json
es un elemento esencial de muchos proyectos basados en el ecosistema Node.js. Si programó en JavaScript, ya sea para el desarrollo del servidor o del cliente, probablemente ya haya visto este archivo. ¿Por qué es necesario? ¿Qué debes saber sobre él y qué oportunidades te ofrece?
Package.json
es un tipo de archivo de manifiesto para un proyecto. Pone a disposición del desarrollador muchas posibilidades diversas. Por ejemplo, representa el repositorio central de configuraciones para las herramientas utilizadas en el proyecto. Además, es el lugar donde
npm y
yarn escriben información sobre los nombres y versiones de los paquetes instalados.
▍ Estructura de archivo
Aquí hay un ejemplo de un archivo
package.json
simple:
{ }
Como puede ver, está vacío. No hay requisitos estrictos con respecto a lo que debe estar presente en dicho archivo para una determinada aplicación. El único requisito para la estructura de archivos es que debe seguir las reglas del formato JSON. De lo contrario, este archivo no puede ser leído por programas que intenten acceder a su contenido.
Si crea un paquete Node.js que tiene la intención de distribuir a través de npm, entonces todo cambia radicalmente y su
package.json
debería tener un conjunto de propiedades que ayudarán a otras personas a usar el paquete. Hablaremos más sobre esto más tarde.
Aquí hay otro ejemplo de
package.json
:
{ "name": "test-project" }
Establece la propiedad de
name
, cuyo valor es el nombre de la aplicación o paquete cuyos materiales están contenidos en la misma carpeta donde se encuentra este archivo.
Aquí hay un ejemplo más complicado que tomé de una aplicación de ejemplo escrita usando 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" ] }
Como puede ver, hay muchas cosas interesantes. A saber, las siguientes propiedades se pueden distinguir aquí:
name
: establece el nombre de la aplicación (paquete).version
: contiene información sobre la versión actual de la aplicación.description
: una breve descripción de la aplicación.main
: establece el punto de entrada a la aplicación.private
: si esta propiedad se establece en true
, esto evita que el paquete se publique accidentalmente en npm.scripts
: define un conjunto de scripts de Node.js que se pueden ejecutar.dependencies
: contiene una lista de paquetes npm de los que depende la aplicación.devDependencies
: contiene una lista de paquetes npm utilizados al desarrollar un proyecto, pero no cuando realmente funciona.engines
: establece la lista de versiones de Node.js en las que se ejecuta la aplicación.browserlist
: se usa para almacenar la lista de navegadores (y sus versiones) que la aplicación debería admitir.
Todas estas propiedades son utilizadas por npm o por otras herramientas utilizadas a lo largo del ciclo de vida de la aplicación.
▍Propiedades utilizadas en package.json
Hablemos de las propiedades que se pueden usar en
package.json
. Aquí usaremos el término "paquete", pero todo lo que se dice sobre los paquetes también es cierto para las aplicaciones locales que no están planificadas para usarse como paquetes.
La mayoría de las propiedades que describimos se usan solo para las necesidades del
repositorio npm, algunas son usadas por programas que interactúan con código como el mismo npm.
Nombre de propiedad
La propiedad de
name
establece el nombre del paquete:
"name": "test-project"
El nombre debe tener menos de 214 caracteres, no debe incluir espacios, debe constar solo de letras mayúsculas, guiones (
-
) y guiones bajos (
_
).
Existen restricciones similares porque cuando un paquete se publica en npm, su nombre se usa para formar la URL de la página del paquete.
Si publicó el código del paquete en GitHub, en el dominio público, entonces una buena opción para el nombre del paquete es el nombre del repositorio de GitHub correspondiente.
Propiedad del autor
La propiedad del
author
contiene información sobre el autor del paquete:
{ "author": "Flavio Copes <flavio@flaviocopes.com> (https://flaviocopes.com)" }
Se puede presentar en el siguiente formato:
{ "author": { "name": "Flavio Copes", "email": "flavio@flaviocopes.com", "url": "https://flaviocopes.com" } }
Propiedad de contribuyentes
La propiedad de
contributors
contiene una matriz con información sobre las personas que contribuyeron al proyecto:
{ "contributors": [ "Flavio Copes <flavio@flaviocopes.com> (https://flaviocopes.com)" ] }
Esta propiedad puede verse así:
{ "contributors": [ { "name": "Flavio Copes", "email": "flavio@flaviocopes.com", "url": "https://flaviocopes.com" } ] }
Propiedad de errores
La propiedad de
bugs
contiene un enlace al rastreador de errores del proyecto, es muy probable que dicho enlace conduzca a la página del sistema de seguimiento de errores de GitHub:
{ "bugs": "https://github.com/flaviocopes/package/issues" }
Propiedad de la página de inicio
La propiedad de la
homepage
permite configurar la página de inicio del paquete:
{ "homepage": "https://flaviocopes.com/package" }
Propiedad de la versión
La propiedad de
version
contiene información sobre la versión actual del paquete:
"version": "1.0.0"
Al formar el valor de esta propiedad, debe seguir las reglas de
versiones semánticas . Esto significa, en particular, que el número de versión siempre está representado por tres dígitos: xxx
El primer número es la versión principal del paquete, el segundo es la versión secundaria, el tercero es la versión del parche.
Cambiar estos números tiene un cierto significado. Por lo tanto, el lanzamiento de un paquete en el que los errores solo se corrigen conduce a un aumento en el valor de la versión del parche. Si se lanza un paquete, los cambios realizados son compatibles con versiones anteriores, entonces la versión menor cambia. Las versiones principales de paquetes pueden contener cambios que hacen que estos paquetes sean incompatibles con paquetes de versiones principales anteriores.
Propiedad de la licencia
La propiedad de la
license
contiene información de la
license
paquete:
"license": "MIT"
Propiedad de palabras clave
La propiedad de
keywords
contiene una serie de palabras clave relacionadas con la funcionalidad del paquete:
"keywords": [ "email", "machine learning", "ai" ]
La selección correcta de palabras clave ayuda a las personas a encontrar lo que necesitan cuando buscan paquetes para resolver ciertos problemas, le permite agrupar paquetes y evaluar rápidamente su posible funcionalidad al ver el sitio npm.
Descripción de la propiedad
La propiedad de
description
contiene una breve descripción del paquete:
"description": "A package to work with strings"
Esta propiedad es especialmente importante si planea publicar el paquete en npm, ya que permite a los usuarios del sitio npm comprender el propósito del paquete.
Propiedad del repositorio
La propiedad del
repository
indica dónde se encuentra el repositorio del paquete:
"repository": "github:flaviocopes/testing",
Tenga en cuenta que el valor de esta propiedad tiene el prefijo
github
. Npm también admite prefijos para algunos otros servicios populares de este tipo:
"repository": "gitlab:flaviocopes/testing", "repository": "bitbucket:flaviocopes/testing",
El sistema de control de versiones utilizado en el desarrollo del paquete también se puede configurar explícitamente:
"repository": { "type": "git", "url": "https://github.com/flaviocopes/testing.git" }
El mismo paquete puede usar diferentes sistemas de control de versiones:
"repository": { "type": "svn", "url": "..." }
Propiedad principal
La propiedad
main
establece el punto de entrada al paquete:
"main": "src/main.js"
Cuando se importa un paquete a la aplicación, aquí es donde se realizará la búsqueda de lo que exporta el módulo correspondiente.
Propiedad privada
La propiedad
private
establecida en
true
evita que el paquete se publique accidentalmente en npm:
"private": true
Propiedad Scripts
La propiedad de
scripts
establece la lista de scripts o utilidades que se pueden iniciar con las herramientas npm:
"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 usando npm o yarn, respectivamente, ejecutando comandos de la forma
npm run XXXX
o
yarn XXXX
, donde
XXXX
es el nombre del script. Por ejemplo, podría verse así:
npm run dev
Los scripts se pueden invocar como desee, pueden hacer casi todo lo que un desarrollador pueda desear.
Propiedad de dependencias
La propiedad de
dependencies
contiene una lista de paquetes npm instalados como dependencias de paquetes:
"dependencies": { "vue": "^2.5.2" }
Al instalar un paquete usando npm o yarn, se utilizan los siguientes comandos:
npm install <PACKAGENAME> yarn add <PACKAGENAME>
Estos paquetes se agregan automáticamente a la lista de dependencias del paquete que se está desarrollando.
Propiedad DevDependencies
La propiedad
devDependencies
contiene una lista de paquetes npm instalados como dependencias de desarrollo:
"devDependencies": { "autoprefixer": "^7.1.2", "babel-core": "^6.22.1" }
Esta lista es diferente de la que está almacenada en la propiedad de
dependencies
, ya que los paquetes disponibles en ella se instalan solo en el sistema del desarrollador del paquete; en el uso práctico del paquete, no se usan.
Los paquetes entran en esta lista cuando se instalan usando npm o hilo, de la siguiente manera:
npm install --dev <PACKAGENAME> yarn add --dev <PACKAGENAME>
Propiedad de motores
La propiedad de
engines
indica qué versiones de Node.js y otros productos de software se utilizan para proporcionar el paquete:
"engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0", "yarn": "^0.13.0" }
Propiedad de lista de navegadores
La propiedad
browserlist
permite informar qué navegadores (y sus versiones) serán compatibles con el desarrollador del paquete:
"browserslist": [ "> 1%", "last 2 versions", "not ie <= 8" ]
Esta propiedad es utilizada por Babel, Autoprefixer y otras herramientas. El análisis de esta lista les permite agregar al paquete solo aquellos polyfills y mecanismos auxiliares que son necesarios para los navegadores listados.
El valor de la propiedad de lista de
browserlist
muestra aquí como ejemplo significa que desea admitir al menos 2 versiones principales de todos los navegadores con al menos un 1% de uso (estos datos se toman de
CanIUse.com ), con la excepción de IE 8 y versiones anteriores de este navegador (más esto se puede encontrar en la
página del paquete de
listas de navegadores ).
▍ Almacenamiento en la configuración de package.json para varias herramientas de software
En
package.json
puede almacenar configuraciones para varias herramientas auxiliares como Babel o ESLint.
Cada una de estas herramientas tiene una propiedad especial, como
eslintConfig
o
babel
. Los detalles sobre el uso de tales propiedades se pueden encontrar en la documentación de los respectivos proyectos.
▍Sobre versiones de paquetes y versiones semánticas
, , , . ,
~3.0.0
^0.13.0
. , , .
, , , , :
~
: ~0.13.0
, - . , 0.13.1
, 0.14.0
— .^
: ^0.13.0
, , - . , 0.13.1
, 0.14.0
, .*
: , , , — .>
: , .>=
: , .<=
: , .<
: , .=
: .-
: , — 2.1.0 - 2.6.2
.||
: , . < 2.1 || > 2.6
.
:
, , -. ,
1.0.0 || >=1.1.0 <1.2.0
,
1.0.0
, ,
1.1.0
,
1.2.0
.
package-lock.json
package-lock.json
npm 5. Node.js-. ? ,
package.json
, .
, , , , .
,
package.json
.
package.json
, (- ) .
Git
node_modules
, . ,
npm install
, , ,
~
, -, , , -.
^
. , , , .
, - ,
npm install
. , . , , - , , , ( ) .
package-lock.json
npm
npm install
.
, , ( Composer PHP) .
package-lock.json
Git-, , , , , Git .
package-lock.json
npm update
.
▍ package-lock.json
package-lock.json
, cowsay, npm
install cowsay
:
{ "requires": true, "lockfileVersion": 1, "dependencies": { "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3. 0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "cowsay": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/cowsay/-/cowsay-1.3.1.tgz" , "integrity": "sha512-3PVFe6FePVtPj1HTeLin9v8WyLl+VmM1l1H/5P+BTTDkM Ajufp+0F9eLjzRnOHzVAYeIYFF5po5NjRrgefnRMQ==", "requires": { "get-stdin": "^5.0.1", "optimist": "~0.6.1", "string-width": "~2.1.1", "strip-eof": "^1.0.0" } }, "get-stdin": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0. 1.tgz", "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/ is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "minimist": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10 .tgz", "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "requires": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" } }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" } }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { "ansi-regex": "^3.0.0" } }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" } } }
. cowsay, :
- get-stdin
- optimist
- string-width
- strip-eof
, , ,
requires
, :
- ansi-regex
- is-fullwidth-code-point
- minimist
- wordwrap
- strip-eof
,
version
,
resolved
, ,
integrity
, .
npm
package.json
package-lock.json
. npm npx.
Estimados lectores! — npm yarn?
