Aujourd'hui, nous publions la quatrième partie de la traduction de Node.js. Dans cet article, nous allons commencer à parler de npm et également considérer les fonctionnalités des
package-lock.json
package.json
et
package-lock.json
.

[Nous vous conseillons de lire] Autres parties du cyclePartie 1:
Informations générales et mise en routePartie 2:
JavaScript, V8, quelques astuces de développementPartie 3:
Hébergement, REPL, travailler avec la console, les modulesPartie 4:
fichiers npm, package.json et package-lock.jsonPartie 5:
npm et npxPartie 6:
boucle d'événements, pile d'appels, temporisateursPartie 7:
Programmation asynchronePartie 8:
Guide Node.js, Partie 8: Protocoles HTTP et WebSocketPartie 9:
Guide Node.js, partie 9: utilisation du système de fichiersPartie 10:
Guide Node.js, Partie 10: Modules standard, flux, bases de données, NODE_ENVPDF complet du guide Node.js Les bases du NPM
Npm (gestionnaire de packages de nœuds) est le gestionnaire de packages Node.js. Dans la première partie de ce document, nous avons déjà mentionné que maintenant, dans npm, il existe plus d'un demi-million de packages, ce qui en fait le plus grand référentiel de code écrit au monde dans une seule langue. Cela suggère que dans npm, vous pouvez trouver des packages conçus pour résoudre presque toutes les tâches.
Initialement, npm a été créé en tant que système de gestion de packages pour Node.js, mais aujourd'hui, il est également utilisé pour développer des projets frontaux en JavaScript. Pour interagir avec le registre npm, la commande du même nom est utilisée, ce qui donne au développeur de nombreuses opportunités.
▍Chargement de packages
À l'aide de la commande
npm
, vous pouvez télécharger des packages à partir du registre. Ci-dessous, nous considérerons des exemples de son utilisation.
▍Installation de toutes les dépendances du projet
Si le projet a un fichier
package.json
, vous pouvez installer toutes les dépendances de ce projet avec la commande suivante:
npm install
Cette commande télécharge tout ce dont le projet a besoin et place ces matériaux dans le dossier
node_modules
, en le créant s'il n'existe pas dans le répertoire du projet.
▍Installation d'un package séparé
Un autre peut être installé avec la commande suivante:
npm install <package-name>
Vous pouvez souvent voir comment cette commande est utilisée non pas sous une forme aussi simple, mais avec certains indicateurs. Considérez-les:
- L'indicateur
--save
permet d'installer un package et d'ajouter une entrée à ce sujet dans la section des dependencies
du fichier package.json
, qui décrit les dépendances du projet. Ces dépendances sont utilisées par le projet pour implémenter ses principales fonctionnalités, elles sont installées lors de son déploiement sur le serveur (après la sortie de npm 5, les entrées sur les packages installés dans la section des dépendances sont faites automatiquement, et sans utiliser cet indicateur). - L'
--save-dev
vous permet d'installer le package et d'ajouter une entrée à ce sujet à la section contenant une liste des dépendances de développement (c'est-à-dire les packages qui sont nécessaires pendant le développement du projet, comme les bibliothèques pour les tests, mais ne sont pas nécessaires pour son fonctionnement) du fichier package.json
appelé devDependencies
.
▍ Pack Update
Pour mettre à jour des packages, utilisez la commande suivante:
npm update
Après avoir reçu cette commande, npm vérifiera tous les packages pour leurs nouvelles versions et s'ils trouvent que leurs nouvelles versions respectent les restrictions de version de package spécifiées dans
package.json
, installez-les.
Vous pouvez également mettre à niveau un package distinct:
npm update <package-name>
▍Mise en ligne des packages de certaines versions
En plus des téléchargements de packages standard, npm prend également en charge le téléchargement de versions spécifiques d'entre eux. En particulier, on peut noter que certaines bibliothèques ne sont compatibles qu'avec certaines versions importantes d'autres bibliothèques, c'est-à-dire que si les dépendances de ces bibliothèques étaient installées sans tenir compte des versions, cela pourrait perturber leur travail. La possibilité d'installer une version spécifique d'un package est utile dans les situations où, par exemple, la dernière version de ce package vous convient parfaitement, mais il s'avère qu'il contient une erreur. En attendant la sortie d'une version fixe du package, vous pouvez utiliser sa version plus ancienne mais stable.
La possibilité de spécifier des versions spécifiques des bibliothèques requises par le projet est utile dans le développement d'équipe lorsque tous les membres de l'équipe utilisent exactement les mêmes bibliothèques. La transition vers leurs nouvelles versions s'effectue également de manière centralisée, en apportant des modifications au fichier de projet
package.json
.
Dans tous ces cas, la possibilité de spécifier les versions de package requises par le projet est extrêmement utile. Npm suit le standard du versioning sémantique (semver).
▍Exécuter des scripts
Le fichier
package.json
prend en charge la possibilité de décrire les commandes (scripts) qui peuvent être lancées à l'aide de cette construction:
npm <task-name>
Par exemple, voici à quoi ressemble la liste des scripts dans la section correspondante du fichier:
{ "scripts": { "start-dev": "node lib/server-development", "start": "node lib/server-production" } }
Il est très courant d'utiliser cette fonctionnalité pour démarrer 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", } }
Cette approche permet de remplacer l'entrée de commandes longues, lourdes d'erreurs, par les constructions simples suivantes:
$ npm watch $ npm dev $ npm prod
HereOù npm installe-t-il les packages?
Lors de l'installation de packages à l'aide de npm (ou
yarn ), deux options d'installation sont disponibles: locale et globale.
Par défaut, lorsque vous utilisez une commande telle que
npm install lodash
, le package apparaît dans le dossier
node_modules
situé dans le dossier du projet. De plus, si la commande ci-dessus a été exécutée, npm ajoutera également une entrée pour la bibliothèque
lodash
à la section des
dependencies
du fichier
package.json
, qui se trouve dans le répertoire en cours.
L'installation globale des packages est effectuée à l'aide de l'indicateur
-g
:
npm install -g lodash
En exécutant une telle commande, npm n'installe pas le package dans le dossier local du projet. Au lieu de cela, il copie les fichiers du package dans un emplacement global. Où vont exactement ces fichiers?
Pour le savoir, utilisez la commande suivante:
npm root -g
Sous macOS ou Linux, les fichiers de package peuvent apparaître dans le
/usr/local/lib/node_modules
. Sous Windows, il peut s'agir de quelque chose comme
C:\Users\YOU\AppData\Roaming\npm\node_modules
.
Toutefois, si vous utilisez Node.js nvm pour le contrôle de version, le chemin d'accès au dossier de package global peut changer.
Par exemple, j'utilise nvm et la commande ci-dessus m'indique que les packages globaux sont installés à cette adresse:
/Users/flavio/.nvm/versions/node/v8.9.0/lib/node_modules
.
▍Utiliser et exécuter des packages installés avec npm
Comment utiliser les modules installés en utilisant npm, localement ou globalement, tombant dans les dossiers
node_modules
? Supposons que vous ayez installé la bibliothèque
lodash
populaire, qui contient de nombreuses fonctions d'assistance utilisées dans le développement JavaScript:
npm install lodash
Une telle commande installera la bibliothèque dans le dossier local du projet
node_modules
.
Pour l'utiliser dans votre code, importez-le simplement à l'aide de la commande
require
:
const _ = require('lodash')
Que faire si le package est un fichier exécutable?
Dans ce cas, le fichier exécutable se
node_modules/.bin/ folder
dans le
node_modules/.bin/ folder
.
Vous pouvez voir comment ce mécanisme fonctionne en installant le paquet
cowsay . Il s'agit d'un programme comique écrit pour la ligne de commande. Si vous passez du texte à ce paquet, dans la console, dans le style de l'art ASCII, une image d'une vache sera affichée qui "prononcera" le texte correspondant. D'autres créatures peuvent «exprimer» le texte.
Ainsi, après avoir installé le package à l'aide de la
npm install cowsay
, celui-ci, avec ses dépendances, se
node_modules
dans
node_modules
. Et dans le dossier
.bin
caché seront écrits des liens symboliques vers des fichiers binaires cowsay.
Comment les réaliser?
Bien sûr, vous pouvez entrer quelque chose comme
./node_modules/.bin/cowsay
dans le terminal pour appeler le programme, c'est une approche de travail, mais il est beaucoup mieux d'utiliser
npx , un outil pour lancer les exécutables du package npm, inclus dans npm depuis la version 5.2. A savoir, dans notre cas, nous avons besoin de la commande suivante:
npx cowsay
Le chemin vers le package npx sera trouvé automatiquement.
Fichier Package.json
Le fichier
package.json
est un élément essentiel de nombreux projets basés sur l'écosystème Node.js. Si vous avez programmé en JavaScript, qu'il s'agisse de développement serveur ou client, vous avez probablement déjà vu ce fichier. Pourquoi est-il nécessaire? Que devez-vous savoir sur lui et quelles opportunités vous offre-t-il?
Package.json
est une sorte de fichier manifeste pour un projet. Il met à la disposition du développeur de nombreuses possibilités diverses. Par exemple, il représente le référentiel central des paramètres des outils utilisés dans le projet. De plus, c'est l'endroit où
npm et
yarn écrivent des informations sur les noms et les versions des packages installés.
▍ Structure des fichiers
Voici un exemple de fichier
package.json
simple:
{ }
Comme vous pouvez le voir, il est vide. Il n'y a pas d'exigences strictes concernant ce qui doit être présent dans un tel fichier pour une certaine application. La seule exigence pour la structure du fichier est qu'elle doit suivre les règles du format JSON. Sinon, ce fichier ne peut pas être lu par les programmes qui tentent d'accéder à son contenu.
Si vous créez un package Node.js que vous avez l'intention de distribuer via npm, alors tout change radicalement et votre
package.json
doit avoir un ensemble de propriétés qui aideront d'autres personnes à utiliser le package. Nous en reparlerons plus tard.
Voici un autre exemple de
package.json
:
{ "name": "test-project" }
Il définit la propriété
name
, dont la valeur est le nom de l'application ou du package dont les matériaux sont contenus dans le même dossier où se trouve ce fichier.
Voici un exemple plus compliqué que j'ai pris d'un exemple d'application écrit en utilisant 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" ] }
Comme vous pouvez le voir, il y a juste beaucoup de choses intéressantes. À savoir, les propriétés suivantes peuvent être distinguées ici:
name
- définit le nom de l'application (package).version
- contient des informations sur la version actuelle de l'application.description
- une brève description de l'application.main
- définit le point d'entrée de l'application.private
- si cette propriété est définie sur true
, cela empêche la publication accidentelle du package vers npm.scripts
- définit un ensemble de scripts Node.js qui peuvent être exécutés.dependencies
- contient une liste des packages npm dont dépend l'application.devDependencies
- contient une liste des packages npm utilisés lors du développement d'un projet, mais pas quand cela fonctionne vraiment.engines
- définit la liste des versions de Node.js sur lesquelles l'application s'exécute.browserlist
- utilisé pour stocker la liste des navigateurs (et leurs versions) que l'application doit prendre en charge.
Toutes ces propriétés sont utilisées par npm ou par d'autres outils utilisés tout au long du cycle de vie de l'application.
▍Propriétés utilisées dans package.json
Parlons des propriétés qui peuvent être utilisées dans
package.json
. Ici, nous utiliserons le terme «package», mais tout ce qui est dit sur les packages est également vrai pour les applications locales qui ne sont pas prévues pour être utilisées comme packages.
La plupart des propriétés que nous décrivons sont utilisées uniquement pour les besoins du
référentiel npm, certaines sont utilisées par des programmes qui interagissent avec du code comme le même npm.
Propriété de nom
La propriété
name
définit le nom du package:
"name": "test-project"
Le nom doit être plus court que 214 caractères, ne doit pas inclure d'espaces, doit être composé uniquement de majuscules, de tirets (
-
) et de traits de soulignement (
_
).
Des restrictions similaires existent car lorsqu'un package est publié dans npm, son nom est utilisé pour former l'URL de la page du package.
Si vous avez publié le code du package sur GitHub, dans le domaine public, une bonne option pour le nom du package est le nom du référentiel GitHub correspondant.
Propriété d'auteur
La propriété
author
contient des informations sur l'auteur du package:
{ "author": "Flavio Copes <flavio@flaviocopes.com> (https://flaviocopes.com)" }
Il peut être présenté dans le format suivant:
{ "author": { "name": "Flavio Copes", "email": "flavio@flaviocopes.com", "url": "https://flaviocopes.com" } }
Propriété des contributeurs
La propriété
contributors
contient un tableau contenant des informations sur les personnes qui ont contribué au projet:
{ "contributors": [ "Flavio Copes <flavio@flaviocopes.com> (https://flaviocopes.com)" ] }
Cette propriété peut ressembler à ceci:
{ "contributors": [ { "name": "Flavio Copes", "email": "flavio@flaviocopes.com", "url": "https://flaviocopes.com" } ] }
Propriété Bugs
La propriété
bugs
contient un lien vers le suivi des bogues du projet, il est très probable qu'un tel lien mène à la page du système de suivi des erreurs GitHub:
{ "bugs": "https://github.com/flaviocopes/package/issues" }
Propriété de la page d'accueil
La propriété de la
homepage
vous permet de définir la page d'accueil du package:
{ "homepage": "https://flaviocopes.com/package" }
Propriété de version
La propriété
version
contient des informations sur la version actuelle du package:
"version": "1.0.0"
Lors de la formation de la valeur de cette propriété, vous devez suivre les règles de
gestion de versions sémantique . Cela signifie notamment que le numéro de version est toujours représenté par trois chiffres: xxx
Le premier numéro est la version principale du package, le second est la version mineure, le troisième est la version patch.
Changer ces chiffres a une certaine signification. Ainsi, la sortie d'un package dans lequel les erreurs ne sont corrigées mène qu'à une augmentation de la valeur de la version du patch. Si un package est publié, dont les modifications apportées sont rétrocompatibles avec la version précédente, la version mineure change. Les versions majeures des packages peuvent contenir des modifications qui rendent ces packages incompatibles avec les packages des versions majeures précédentes.
Propriété de licence
La propriété de
license
contient des informations sur la
license
package:
"license": "MIT"
Mots-clés propriété
La propriété
keywords
contient un tableau de mots-clés liés à la fonctionnalité du package:
"keywords": [ "email", "machine learning", "ai" ]
La sélection correcte des mots clés aide les gens à trouver ce dont ils ont besoin lors de la recherche de packages pour résoudre certains problèmes, vous permet de regrouper les packages et d'évaluer rapidement leurs fonctionnalités possibles lors de la consultation du site npm.
Description de la propriété
La propriété
description
contient une brève description du package:
"description": "A package to work with strings"
Cette propriété est particulièrement importante si vous prévoyez de publier le package dans npm, car elle permet aux utilisateurs du site npm de comprendre l'objectif du package.
Propriété du référentiel
La propriété du
repository
indique où se trouve le référentiel de packages:
"repository": "github:flaviocopes/testing",
Notez que la valeur de cette propriété a le préfixe
github
. Npm prend également en charge les préfixes pour certains autres services populaires de ce type:
"repository": "gitlab:flaviocopes/testing", "repository": "bitbucket:flaviocopes/testing",
Le système de contrôle de version utilisé dans le développement du package peut également être défini explicitement:
"repository": { "type": "git", "url": "https://github.com/flaviocopes/testing.git" }
Le même package peut utiliser différents systèmes de contrôle de version:
"repository": { "type": "svn", "url": "..." }
Propriété principale
La propriété
main
définit le point d'entrée du package:
"main": "src/main.js"
Lorsqu'un package est importé dans l'application, c'est là que la recherche sera effectuée pour ce que le module correspondant exporte.
Propriété privée
La propriété
private
définie sur
true
empêche la publication accidentelle du package vers npm:
"private": true
Propriété Scripts
La propriété
scripts
définit la liste des scripts ou des utilitaires pouvant être lancés à l'aide des outils 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" }
Ces scripts sont des applications en ligne de commande. Vous pouvez les exécuter en utilisant npm ou yarn, respectivement, en exécutant des commandes de la forme
npm run XXXX
ou
yarn XXXX
, où
XXXX
est le nom du script. Par exemple, cela pourrait ressembler à ceci:
npm run dev
Les scripts peuvent être appelés comme vous le souhaitez, ils peuvent faire presque tout ce qu'un développeur peut souhaiter.
Propriété des dépendances
La propriété
dependencies
contient une liste de packages npm installés en tant que dépendances de package:
"dependencies": { "vue": "^2.5.2" }
Lors de l'installation d'un package à l'aide de npm ou de fil, les commandes suivantes sont utilisées:
npm install <PACKAGENAME> yarn add <PACKAGENAME>
Ces packages sont automatiquement ajoutés à la liste des dépendances du package en cours de développement.
DevDependencies, propriété
La propriété
devDependencies
contient une liste de packages npm installés en tant que dépendances de développement:
"devDependencies": { "autoprefixer": "^7.1.2", "babel-core": "^6.22.1" }
Cette liste est différente de celle stockée dans la propriété
dependencies
, car les packages qui y sont disponibles sont installés uniquement dans le système du développeur du package; dans l'utilisation pratique du package, ils ne sont pas utilisés.
Les packages entrent dans cette liste lorsqu'ils sont installés à l'aide de npm ou de fil, comme suit:
npm install --dev <PACKAGENAME> yarn add --dev <PACKAGENAME>
Propriété des moteurs
La propriété
engines
indique quelles versions de Node.js et d'autres produits logiciels sont utilisés pour fournir le package:
"engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0", "yarn": "^0.13.0" }
Propriété Browserlist
La propriété
browserlist
permet de signaler les navigateurs (et leurs versions) qui seront pris en charge par le développeur du package:
"browserslist": [ "> 1%", "last 2 versions", "not ie <= 8" ]
Cette propriété est utilisée par Babel, Autoprefixer et d'autres outils. L'analyse de cette liste leur permet d'ajouter au package uniquement les polyfills et les mécanismes auxiliaires nécessaires aux navigateurs répertoriés.
La valeur de la propriété
browserlist
présentée ici à titre d'exemple signifie que vous souhaitez prendre en charge au moins 2 versions principales de tous les navigateurs avec au moins 1% d'utilisation (ces données proviennent de
CanIUse.com ), à l'exception d'IE 8 et des versions plus anciennes de ce navigateur (plus cela peut être trouvé sur la
page du package de
listes de navigateurs )
▍ Stockage dans les paramètres package.json pour divers outils logiciels
Dans
package.json
vous pouvez stocker les paramètres de divers outils auxiliaires comme Babel ou ESLint.
Chacun de ces outils a une propriété spéciale, comme
eslintConfig
ou
babel
. Des détails sur l'utilisation de ces propriétés peuvent être trouvés dans la documentation des projets respectifs.
▍À propos des versions de packages et du versionnage sémantique
, , , . ,
~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.
Chers lecteurs! — npm yarn?
