Manual Node.js, Parte 4: archivos npm, package.json y package-lock.json

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 .




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 .

:

  • : , , - .
  • latest : , .

, , -. , 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?

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


All Articles