web-dev-qa-db-fra.com

Avantages de bundledDependencies par rapport aux dépendances normales dans NPM

npm nous permet de spécifier bundledDependencies mais quels sont les avantages de le faire? J'imagine que si nous voulons être absolument sûrs d'obtenir la bonne version même si le module auquel nous faisons référence est supprimé, ou peut-être qu'il y a un avantage de rapidité avec le groupement?

Quelqu'un connaît les avantages de bundledDependencies sur les dépendances normales?

Extrait de la définition de bundledDependencies ici pour plus de commodité:

bundledDependencies
Tableau de noms de packages qui seront regroupés lors de la publication du package.

Si ceci est orthographié "bundleDependencies", alors c'est aussi honorable.

Par exemple. bundledDependencies: ['foo', 'bar']

63
balupton

L’un des plus gros problèmes actuellement avec Node est la rapidité avec laquelle il change. Cela signifie que les systèmes de production peuvent être très fragiles et qu'un npm update peut facilement casser des choses.

Utiliser bundledDependencies est un moyen de résoudre ce problème en vous assurant, comme vous le supposez, que vous obtiendrez toujours les dépendances correctes, quelles que soient les modifications apportées.

Vous pouvez également l'utiliser pour regrouper vos propres ensembles privés et les livrer avec l'installation.

36
Julian Knight

Pour le lecteur rapide: ce contrôle qualité concerne le champ package.json bundledDependencies, pas concernant le package .

Que font les dépendances groupées?

"bundledDependencies" sont exactement ce que leur nom implique. Les dépendances qui devraient être à l'intérieur de votre projet. La fonctionnalité est donc fondamentalement la même que celle des dépendances normales. Ils seront également emballés lors de l'exécution de npm pack.

Quand les utiliser

Les dépendances normales sont généralement installées à partir du registre npm. Ainsi, les dépendances groupées sont utiles lorsque:

  • vous voulez réutiliser une bibliothèque tierce qui ne provient pas du registre npm ou qui a été modifiée
  • vous voulez réutiliser vos propres projets en tant que modules
  • vous voulez distribuer des fichiers avec votre module

De cette façon, vous n'avez pas besoin de créer (et de maintenir) votre propre référentiel npm, mais d'obtenir les mêmes avantages que ceux obtenus avec les packages npm.

Quand pas utiliser des dépendances groupées

Lors du développement, je ne pense pas que l’essentiel est d’empêcher les mises à jour accidentelles. Nous avons de meilleurs outils pour cela, à savoir les référentiels de code (git, Mercurial, svn ...) ou maintenant les fichiers verrouillés.

Pour épingler les versions de vos paquets, vous pouvez utiliser:

  • Option 1: Utilisez la version 5 de NPM la plus récente, fournie avec le noeud 8. Elle utilise un fichier package-lock.json (voir le blog du noeud et la version du noeud 8).

  • Option 2: utilisez fil au lieu de npm. C'est un gestionnaire de paquets de facebook, plus rapide que npm et utilise un fichier yarn.lock . Il utilise le même package.json sinon.

Ceci est comparable aux fichiers lockfiles d'autres gestionnaires de paquets tels que Bundler ou une cargaison. Cela ressemble à npm-shrinkwrap.json, mais ce n’est pas le cas avec pertes et cela crée des résultats reproductibles.

npm a en fait copié cette fonctionnalité à partir de yarn, entre autres choses.

  • Option 3: c'était l'approche précédemment recommandée, ce que je ne recommande plus. L'idée était d'utiliser npm shrinkwrap la plupart du temps, et parfois de tout mettre dans son contenu, y compris le dossier node_module, dans votre référentiel de code. Ou utilisez éventuellement shrinkpack . Les meilleures pratiques de l'époque ont été discutées sur les sites Web blog.noj.js et sur les sites { joyent developer }.

Voir également

C'est un peu en dehors du champ de la question, mais j'aimerais mentionner le dernier type de dépendances (que je connaisse): dépendances entre pairs . Voir aussi cette liée SO question } et éventuellement la documentation de yarn sur bundledDependencies .

92
nha

Un autre avantage est que vous pouvez y placer vos dépendances internes (composants d’application), puis les exiger dans votre application comme si elles étaient des modules indépendants au lieu d’encombrer votre lib/et de les publier sur npm.

Si/quand ils arrivent à maturité au point où ils pourraient vivre en tant que modules séparés, vous pouvez les mettre facilement sur npm, sans modifier votre code.

22
Boris Egorov

Je suis surpris de ne pas l'avoir déjà vu ici, mais lorsque soigneusement sélectionné, bundledDependencies peut être utilisé pour produire un package distribuable à partir de npm pack qui s'exécutera sur un système où npm n'est pas configuré. Ceci est utile si vous avez par exemple un système qui n'est pas en réseau/sur Internet: déposez votre paquet sur une clé USB (ou autre) et décompressez l'archive, puis npm run ou node index.js et tout fonctionne.

Il existe peut-être un meilleur moyen de regrouper votre application pour une exécution "hors ligne", mais s'il y en a une, je ne l'ai pas trouvée.

1
Coderer

Sur le plan opérationnel, je considère bundledDependencies comme le magasin de modules privé d'un module, où les dépendances sont plus publiques et résolues entre votre module et ses dépendances (et sous-dépendances). Votre module peut s’appuyer sur une version plus ancienne de, par exemple, Reactor, mais une dépendance nécessite les toutes dernières fonctionnalités. Votre paquet/installation donnera votre version épinglée en node_modules/$yourmodule/node_modules/react, tandis que votre dépendance obtiendra sa version en node_modules/react (ou node_modules/$dependency/node_modules/react si elle est tellement inclinée).

Une mise en garde: j'ai récemment rencontré une dépendance qui ne configurait pas correctement sa dépendance, et avoir réagi dans bundledDependencies a entraîné l'échec de ce module dépendant au moment de l'exécution.

0
mushuweasel