web-dev-qa-db-fra.com

Que fait vraiment "Linking Dependencies" pendant l'installation de npm / yarn?

Pour les grandes applications Web npm install resp. yarn install prend beaucoup de temps, principalement dans une étape appelée Linking Dependencies. Que se passe-t-il ici? Récupère-t-il les dépendances des dépendances? Ou quelque chose de complètement différent? Quels fichiers sont créés au cours de cette étape?

22
Zardoz

Quand vous appelez yarn install, les choses suivantes se produisent dans l'ordre:

  1. Résolution : Yarn commence à résoudre les dépendances en faisant des requêtes au registre et en recherchant récursivement chaque dépendance.

  2. Téléchargement/Récupération : Ensuite, Yarn recherche dans un répertoire de cache global pour voir si le package nécessaire a déjà été téléchargé. Si ce n'est pas le cas, Yarn récupère l'archive tar du package et le place dans le cache global afin qu'il puisse fonctionner hors ligne et n'a pas besoin de télécharger les dépendances plus d'une fois. Les dépendances peuvent également être placées dans le contrôle de code source sous forme d'archives tar pour des installations hors ligne complètes.

  3. Liaison : Enfin, Yarn relie tout ensemble en copiant tous les fichiers nécessaires du cache global dans le répertoire node_modules local après avoir identifié ce qui est déjà là et ce qui n'y est pas .


yarn install prend beaucoup de temps, principalement dans une étape appelée Linking Dependencies

Vous devriez remarquer que Step 3: Linking prend plus de temps que Step 1: Resolution et Step 2: Fetching où le téléchargement réel a lieu. Pendant cette étape, nous avons déjà des choses dont nous avons besoin, prêtes et téléchargées, alors pourquoi cela prend-il longtemps, avons-nous raté quelque chose?

Oui, [~ # ~] copiez [~ # ~] dans le projet local dans node_modules dossier ...! La raison en est que cette copie n'est pas équivalente à la copie d'un gros fichier ISO de 4,7 Go. Au lieu de cela, il s'agit de plusieurs super petits fichiers (ne prenez pas la lumière quand je dis plusieurs, il peut s'agir de 15k + fichiers: P), donc prenez beaucoup de temps pour les copier. (En outre, il est important de noter que lorsque vous téléchargez les packages, vous téléchargez un grand fichier tar par package, dont le contenu doit ensuite être extrait dans le cache, ce qui prend également du temps)

Il est plus lent en raison de

  • Anti-virus : Votre antivirus est assis au milieu et fait une inspection rapide (en plus de notre fil vérifiant s'il existe déjà) sur chaque fichier fil essaie de copier sa vitesse de coupe par tellement. Si vous êtes sous Windows, essayez d'ajouter le dossier parent de votre projet comme exception à Windows Defender.
  • Taux de transfert du support de stockage : les SSD peuvent améliorer énormément cette vitesse (Désolé, les SSHD et FireCudas n'aideront pas non plus, ce sera une fois).

Mais est-ce efficace? Puis-je le faire extraire des modules node_modules globaux (après en avoir créé un)?

Non pour les deux questions. En raison du fonctionnement du nœud, chaque package trouve ses dépendances uniquement par rapport à son propre emplacement. Aussi parce que chaque projet peut souhaiter utiliser différentes versions du même package pour garantir son bon fonctionnement et ne pas être interrompu par les mises à jour du package.

Idéalement, le dossier du projet doit être allégé. Un moyen efficace de le faire serait d'avoir un global node_modules dossier. Tous les packages demandés sont téléchargés s'ils ne sont pas déjà présents ET utilisés à partir de cet emplacement. En fait, Ruby le fait de cette façon. Voici mon équivalent global Ruby de node_modules dossier. Notez la présence de différentes versions du même package pour une utilisation dans différents projets.

enter image description here

Mais gardez à l'esprit que cela réduirait la portabilité du projet. C'est un compromis que tout gestionnaire (que ce soit des rubygèmes ou des modules de nœuds) doit faire. Je peux simplement copier le dossier du projet de noeud (ce qui peut en fait prendre des heures car vous allez copier le (local) node_modules également, mais je peux m'attendre à ce qu'il fonctionne si je n'ai que ce dossier de projet, au lieu de copier un projet Ruby ne ferait que quelques secondes à quelques minutes, car il n'y a pas de local packages (ou gems comme ils les appellent), mais l'exécution du projet sur un système différent nécessiterait que ces packages soient présents dans le dossier gems global.

La phase de liaison fonctionne essentiellement en 3 grandes étapes:

  1. Trouvez tous les fichiers qui doivent être dans node_modules
  2. Vérifiez cette liste par rapport à ce qui existe déjà et trouvez ce qui doit être copié du cache vers node_modules
  3. Faites la copie

Peut-être que ce problème sur Github vous aidera.

https://github.com/yarnpkg/yarn/issues/1496

0
Kenchopa