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?
Quand vous appelez yarn install
, les choses suivantes se produisent dans l'ordre:
Résolution : Yarn commence à résoudre les dépendances en faisant des requêtes au registre et en recherchant récursivement chaque dépendance.
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.
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éeLinking 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
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.
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:
Peut-être que ce problème sur Github vous aidera.