Salut à tous,
J'aurais besoin d'un avis concernant la façon de gérer les dépendances dans le cadre d'un futur projet open source que je compte déployer sur npm.
J'essais de limiter au maximum les dépendances mais il y a certaines choses qui sont indispensables pour mon projet (reflect-metadata et inversify par exemple).
Donc je vois 3 solutions possibles pour le moment :
Solution 1
Les inclure directement dans le package.
Pour
- Garantie d'avoir toutes les libs dans la bonne version
Contre
- Bundle beaucoup plus lourd
- Potentiel de duplication du code
Ce qui me gêne le plus avec cette solution c'est que j'ai l'intention de découper les outils en plusieurs packages npm et je pourrais très bien avoir deux packages utilisant la même lib et qui peuvent être importés l'un sans l'autre.
Dans ce cas de figure je serais obligé d'inclure la lib en double...
Solution 2
Les inclure à part dans un fichier que je mets à disposition à part dans le package npm. Un "vendor.js" dans le bundle en quelque sorte.
Pour
- Garantie d'avoir toutes les libs dans la bonne version
- Séparation avec le code des outils
- Souplesse pour l'utilisateur d'utiliser ou non les libs fournies
Contre
- Honnêtement, je suis moyennement sûr de la faisabilité, et de la facilité pour l'utilisateur final
- L'utilisateur n'a le choix que de tout prendre ou rien prendre, donc il peut toujours y avoir de la duplication de code
- Ca fait "magouille" selon moi
Solution 3
Laisser l'utilisateur final importer les dépendances lui-même en documentant quoi installer.
Pour
- L'utilisateur final peut gérer / optimiser son build comme il veut vu qu'il gère tous les vendors
Contre
- Risque qu'il installe pas tout ou pas dans les bonnes versions
- Complexifie l'installation des outils car il doit maintenant installer N libs
Ça fait longtemps que je développe des outils pour notre utilisation interne mais c'est la première fois que je cherche à les diffuser donc je découvre peu à peu les contraintes supplémentaires que cela implique.
Pour le moment je penche assez fortement pour la solution 3, car si je prend l'exemple d'un plugin VueJS, il ne va pas embarquer sa propre version de VueJS. Il va partir du principe que l'utilisateur l'a installé de son côté et qu'il est accessible via une variable globale.
Mais je suis peut-être dans l'erreur. Il y a peut-être aussi d'autres solutions.
Si vous avez des conseils à me donner je vous en serais très reconnaissant.
Merci d'avoir lu jusqu'au bout.
Partager