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?
Réponses
Trop de publicités?Lorsque vous appelez yarn install
, les choses suivantes se produisent dans l'ordre:
Résolution: Fils commence à résoudre les dépendances en faisant des demandes de la base de registre et de manière récursive recherche de chaque dépendance.
Téléchargement/Récupération: Ensuite, le Fil se regarde dans un mondial répertoire de cache pour voir si le paquet a déjà été téléchargé. Si elle n'a pas de Fils récupère l'archive pour le paquet et la place dans le cache global de sorte qu'il peut travailler en mode hors connexion et n'aurez pas besoin de télécharger les dépendances plus d'une fois. Les dépendances peuvent également être placés dans le contrôle de code source comme les archives pour en mode hors connexion complet de l'installation.
Liaison: Enfin, les Fils de liens tout en copiant tous les fichiers nécessaires à partir de la global cache dans le répertoire node_modules après l'identification de ce qui existe déjà et ce n'est pas là.
yarn install
prend beaucoup de temps, surtout dans une étape appeléeLinking Dependencies
Vous devriez noter que Step 3: Linking
prend plus de temps que d' Step 1: Resolution
et Step 2: Fetching
lorsque le téléchargement se passe. Au cours de cette étape nous avons déjà des choses que nous avons besoin de prêt et téléchargé, alors pourquoi est-il si longtemps, avons-nous oublié quelque chose?
Oui, la COPIE locale du projet en node_modules
le dossier...! La raison pour cela est que cette copie n'est pas équivalente à la copie d'un grand 4,7 GO fichier ISO. Au lieu de cela ce sont des multiples de super petits fichiers (Ne le prenez pas la lumière quand je dis plusieurs, il peut être 15k+ fichiers :P ), donc prendre beaucoup de temps à copier. (Aussi, il est important de noter que lorsque vous télécharger les paquets, vous téléchargez un gros tar fichier par paquet, dont le contenu doit ensuite être extraites dans le cache qui prend aussi du temps)
Il est plus lent en raison de
- Anti-virus: Votre antivirus est assis dans le milieu et de faire un rapide inspecter (en plus de notre fils de vérifier s'il existe déjà) sur chaque fichier unique fils est en train d'essayer de copier la coupe de sa vitesse par tellement. Si vous êtes sur Windows, essayez de l'ajouter à votre projet dossier parent comme exception à Windows Defender.
- Support de stockage de taux de transfert: Ssd peut améliorer cette vitesse énormément (Désolé, les disques hybrides ssd et FireCudas n'aidera pas non plus, ça va être un moment).
Mais est-ce efficace? Puis-je prendre du global node_modules (après la création d'un)?
Non aux deux questions. Parce que de la façon de fonctionnement du nœud de chaque colis trouve ses dépendances seulement par rapport à son propre emplacement. Aussi parce que chaque projet peut utiliser plusieurs versions d'un même paquet pour s'assurer de son travail correctement et n'est pas cassée par package de mises à jour.
Idéalement, le dossier de projet doit être maigre. Un moyen efficace de le faire serait d'avoir un mondial node_modules
le dossier. Tout et tous les paquets requis sont téléchargés si ce n'est déjà présent ET utilisé à partir de cet emplacement. En fait Ruby
t-il de cette façon. Voici mes Rubys'équivalent de node_modules
le dossier. Remarquez la présence de différentes versions d'un même package pour une utilisation dans différents projets.
Mais gardez à l'esprit qu'il permettrait de réduire le projet de portabilité. C'est un compromis que tout manager (que ce soit rubygems de nœud ou de modules) a à faire. Je peux juste copier le nœud dossier du projet (qui, en fait, peut prendre des heures, parce que vous sera la copie de la (local) node_modules
le dossier, mais je peux espérer qu'il fonctionne si je viens que le dossier du projet, par opposition à la copie d'un rubis projet serait de seulement quelques secondes à quelques minutes, comme il n'y a pas de locaux de paquets (ou de pierres précieuses comme ils les appellent) dossier, mais l'exécution du projet sur les différents système nécessiterait ces paquets pour être présent sur le mondial de gemmes dossier.
La phase de liaison fonctionne essentiellement en 3 grandes étapes:
- Trouvez tous les fichiers qui doivent être dans node_modules
- Vérifiez cette liste par rapport à ce qui existe déjà et trouvez ce qui doit être copié du cache vers node_modules
- Faites la copie
Peut-être que ce problème sur Github vous aidera.