Lors d'une installation npm
ou bien de la lecture d'un package.json
, vous avez sans doute remarqué qu'il y avait deux grands groupes de dépendances : les dependencies
et les devDependencies
.
Le premier représente les dépendances directs de votre projet (ce dont on a besoin pour que cela fonctionne).
Le second représente ce qui entoure votre projet dans sa phase de développement (les outils qui vont permettre à celui-ci de fonctionner/builder/deployer par exemple).
Il existe un troisième groupe à ne pas négliger : les peerDependencies
Dans cet article, on va vous expliquez ce que peut apporter le champs peerDependencies
dans votre package.json
.
Ça sert à quoi les peerDependencies
?
En ajoutant une dependencie
dans cette section de votre package.json, vous indiquez :
- Que votre code est compatible avec la version de la
dependencie
indiquée - Si la version de la
dependencie
n'existe pas dans les node_modules, on va lever un warning - Si la version de la
dependencie
existe dans les node_modules, on ne fait rien
Cas d'école
Ce cas est valable pour une version
npm
> 3 et < 7 (on en parle à la fin de l'article).
Prenons un projet qui a pour dépendance a
:
// Extrait du package.json de notre projet
{
//...
"dependencies": {
"a": "1.0.0"
}
}
Si on se penche sur le package.json de la dépendance a
nous avons :
// Extrait du package.json de la dépendance a
{
//...
"peerDependencies": {
"b": "^1.0.0"
}
}
Un warning assez commun
Il vous ait peut-être arrivé de tomber sur ce genre de message :
npm WARN react-datepicker@0.25.0 requires a peer of react@^0.14.0 but none was installed.
Comme indiqué plus haut, ce warning
vous informe qu'un package possède une dependencie
qui n'est pas installée (non présente dans vos node_modules
).
Dans notre cas d'école, on va avoir :
npm WARN a@1.0.0 requires a peer of b@^1.0.0 but none was installed.
C'est donc à vous d'installer cette dépendance en l'ajoutant aux dependencies
de votre projet
// Extrait du package.json de notre projet
{
//...
"dependencies": {
"a": "1.0.0",
"b": "1.0.0"
}
}
Les versions installées doivent être compatibles entres elles en suivant la gestion sémantique de version (le semver pour les initié·e·s 👌).
Nouveauté de la version 7 de npm
Assez récente, cette nouvelle version vient changer cette façon de fonctionner.
Comme mentionné plus haut, en fonction de la version de npm
, le comportement sera différent au niveau de l'installation des dependencies
:
- Avant la version 3.0 :
npm
installait automatiquement lespeerDependencies
mais cela occasionnait de nombreux problèmes (de versions...) - Entre 3 et 7 :
npm
lève unwarning
vous informant qu'il y a despeerDependencies
à installer vous même - 7 :
npm
réinstalle automatiquement lespeerDependencies
. Une grosse refactorisation du code interne a permit de résoudre les problèmes rencontrés avant la version 3
Conclusion
La compréhension du concept est finalement assez simple à saisir, je vous encourage à aller jeter un œil à l'intérieur des packages que vous utilisez !
Quant à la montée en version vers npm
7, elle permet de nous facilité la vie sur la gestion de ces dependencies
en nous évitant de nous faire des nœuds au cerveau.
Merci d'avoir lu cet article !
Il a été posté initialement sur le blog de @younup_it :
https://www.younup.fr/blog/a-quoi-servent-les-peerdependencies-dans-le-package-json
Cover par Jackie Zhao sur Unsplash