Seit der Geburt vonNodeim Jahr 2009 hat sich das Node-Ökosystem weiterentwickelt und gediehen. Aus dem Node-Ökosystem abgeleitete Paketmanager sind npm, kpm, pnpm, Yarn, cnpm usw. erschienen. Tatsächlich ist die Entwicklung des Node-Paketmanagers hauptsächlich in 5 Phasen unterteilt. Werfen wir einen Blick auf dieHauptfunktionenundrepräsentativen Produktejeder Phase~
Um genau zu sein: Node existierte nicht ohne einen Paketmanager. Als Node.js 2009 herauskam, wurde auch der Prototyp von npm veröffentlicht. [Verwandte Tutorial-Empfehlungen:nodejs-Video-Tutorial,Programmierunterricht]
npm ist der vollständige Name von Node.js Package Manager; ausEine kurze Geschichte von Node.jskönnen Sie sehen
2009 Node.js is born The first form of npm is created
Lass uns darüber reden Knotenpaket, das nicht angezeigt wird Wie war es in der Manager-Ära? Was ich damals noch tat, war, online nach der offiziellen Website jeder Software zu suchen, z. B. nach der Download-Adresse und dem Herunterladen der Zip-Datei Paket;
Entpacken Sie es und legen Sie es in einem Verzeichnis namens libs im Projekt ab.
Wenn Sie es bequemer machen möchten, fügen Sie den CDN-Link direkt in das HTML ein.
Modulare Verwaltung Zeit? Versionsnummernverwaltung? Auf ein Upgrade angewiesen? Keine davon existiert!
npm v1, v2-Version
Hauptmerkmale:
(1) Verschachtelte Installation abhängiger Pakete derselben Version Abhängigkeiten werden redundant installiert(2) Unsicherheit bei der Installation des Abhängigkeitspakets: Die neueste Version des Abhängigkeitspakets wird standardmäßig installiert (feste Version kann festgelegt werden)
(3) Die serielle Installation von Abhängigkeiten ist langsam; Offline-Caching wird nicht unterstützt
Erklärung 1: Abhängigkeit Verschachtelte Installation Wenn A von B und B von C abhängt, lautet das Verzeichnis node_modules wie folgt:node_modules - package-A -- node_modules --- package-B ----- node_modules ------ package-C -------- some-really-really-really-long-file-name-in-package-c.js
Problem:Eine zu starke Verschachtelung von Abhängigkeiten führt zur Verschachtelungshölle, und Gleichzeitig wird es zu einer großen Anzahl redundanter Installationen derselben abhängigen Pakete kommen, die dazu führen, dass node_modules zu groß ist, sodass Programmierer regelmäßig rm -rf node_modules ausführen müssen. In Windows-Systemen können jedoch viele Programme Dateipfadnamen mit mehr als 260 nicht verarbeiten Zeichen. Dies wurde von frühen Windows-Benutzern von npm gesehen. Erklärung 2: Bei jeder npm-Installation wird standardmäßig die neueste Version der Abhängigkeiten installiert, was zu Unsicherheit bei der Installation von Abhängigkeiten führtProblem:
semver standardisiert die Zusammensetzung der Versionsnummer: alte Version, aktualisieren Sie die HauptversionsnummerY ist die Nebenversionsnummer: Neue API wurde hinzugefügt. Aus Gründen der Abwärtskompatibilität ist die Upgrade-Nebenversionsnummer
Z die Patch-Versionsnummer: Wenn die Reparatur des Abwärtskompatibilitätsfehlers abgeschlossen ist
Der Status kann sein: Alpha (interner Test), Beta (öffentlicher Test), Gamma (ziemlich ausgereifte Testversion), RC (Vorabversion)Der Grund, warum die Version unsicher ist: Beim Ausführen der npm-Standardinstallation Abhängigkeitsanweisung: NPM geht davon aus, dass Entwickler die Semver-Versionsaktualisierungsspezifikationen befolgen und installiert direkt die neueste Version des Abhängigkeitspakets für den EntwicklerLösung 1: Sie können das Standardverhalten der Verwendung von ^ vor der Versionsnummer durch deaktivieren Der Befehl „npm config set save-exact true“
Zusammenfassung: Das Problem, dass die Abhängigkeiten der Abhängigkeitsbibliothek selbst die neueste Nebenversion standardmäßig installieren, konnte nicht gelöst werden
Phase 3: Flache Installation
npm v3-Versionnpm-shrinkwrap.json
Kurze Beschreibung des Prinzips:Erstellen Sie bei der Installation von npm zunächst den Abhängigkeitsbaum und installieren Sie dann alle Abhängigkeiten im Stammverzeichnis von node_modules. Wenn Unterabhängigkeiten auf unterschiedliche Versionen von Abhängigkeiten mit demselben Namen stoßen, werden die Unterabhängigkeiten angezeigt unter ihren eigenen node_modules installiert
Hauptmerkmale:
(1) Redundante Installation reduzieren: Verlassen Sie sich auf eine flache Installation, die unter bestimmten Umständen die Installation redundanter Pakete reduziert
Bestehende Probleme:
(1) „Ghost Abhängigkeit“, „Phantomabhängigkeit“ „ Problem
(2) „Zwillingsfremde“ und „Abhängigkeitspaketklone“ Problem
(3) Das Verzeichnis ist nicht festgelegt: Die Installationsreihenfolge der Abhängigkeiten bestimmt die Verzeichnisstruktur „node_module“
Erklärung 1: Die Reihenfolge der Installation von Abhängigkeiten, die Verzeichnisstruktur node_modules wird bestimmt
Das folgende Szenario:App1 hängt von PaketA und PaketC sowie PaketG und PaketH ab, und PaketA und PaketC hängen beide von PaketB v1.0, PaketG und PaketH ab beide hängen von der Version von packageB v2.0 ab
Wenn Sie zuerst packageA oder packageC installieren, lautet das Verzeichnis node_modules wie folgt
Wenn Sie zuerst packageG oder packageH installieren, lautet das Verzeichnis node_modules wie folgt
Als Antwort auf In der oben genannten Situation bietet npm Anweisungen. Sie können die Verzeichnisstruktur von node_modules nach dem Sortieren manuell organisieren und vereinfachen. Die Verzeichnisstruktur von node_modules ist konsistent und wird von der Installationsreihenfolge abhängiger Pakete nicht beeinflusst. Erklärung 2: Dies ist möglicherweise nicht unbedingt der Fall Reduzieren Sie die Installation redundanter Paketenpm dedupe
Anhand von Beispiel 1 ist ersichtlich, dass abhängige Pakete zwar flach installiert werden, es aber immer noch Abhängigkeitspakete derselben Version mit redundanten Paketen gibt
Erklärung 3: „Twin Strangers“-ProblemSiehe Beispiel 1, die gleiche Version von Abhängigkeitspaketen wird zweimal installiert und an zwei Orten platziert. Dieses Phänomen ist als „Twin Strangers“ bekannt.
Erklärung 4: „Ghost Dependency“-Problem.node_modules Abhängigkeitspakete im ersten. Das Level-Verzeichnis kann von Entwicklern direkt verwendet werden, die Abhängigkeitspakete sind jedoch nicht in package.json definiert. Abhängigkeitspakete werden als „Ghost-Abhängigkeiten“ bezeichnet. Wenn in Front-End-Projekten „Ghost-Abhängigkeiten“ verwendet werden, kann es später zu Problemen kommen.Da diese „Geisterabhängigkeit“ aufgrund der späteren Aktualisierung anderer Abhängigkeiten möglicherweise entfernt wird, ist sie in node_modules nicht mehr vorhanden. Bei der Ausführung von npm install wird die „Geisterabhängigkeit“ subjektiv nicht installiert, was dazu führt, dass das Projekt nicht mehr vorhanden ist gefunden. Gehen Sie zum abhängigen Paket und melden Sie einen Fehler.
Phase 4: Sicherheit und BeschleunigungDie abhängige Installation ist relativ sicher und beschleunigt
Repräsentative Produkte:Garnfreigabeversion, pnpm Release-Version, npm v5-Version (npm v4 hat sich nicht viel geändert, v5 hat einen großen Schritt nach vorne gemacht)
Hauptmerkmale:
(1) Sicherheit: Die Versionssperrdatei wird standardmäßig generiert, um sicherzustellen, dass die Abhängigkeitsversion ist bei jeder Installation gleich Abhängigkeitspakete mehrerer Projekte; npm v7 unterstützt nur die Existenz von Arbeitsbereichen
Probleme:
(1) Ghost-Abhängigkeiten
(2) Abhängigkeitspakete werden wiederholt auf einzelnen Projekten und projektübergreifend installiert
(3) Das Verzeichnis ist nicht festgelegt: Die Installationsreihenfolge der Abhängigkeiten bestimmt die Verzeichnisstruktur „node_module“
Erklärung 1: Über Sicherheityarn v0.x übernimmt die Führung, dicht gefolgt von npm v5.x. Beim Herunterladen von Abhängigkeiten ist eine Abhängigkeitssperrdatei vorhanden Wird standardmäßig generiert, wodurch die Version genau auf einen Wert der .lock-Datei von
yarn gesperrt wird: Sie muss nur mit package.json kombiniert werden, um die Verzeichnisstruktur von node_modules zu bestimmen : Zeichnet die installierte Abhängigkeitsversion und die Verzeichnisstruktur „node_modules“ auf.Zusammenfassung:
Vermeidet die Notwendigkeit, Abhängigkeiten auf verschiedenen Terminals zu installieren, aber das „Abhängigkeitsgeist“-Problem besteht weiterhin.
yarn v0.x Diese Version ist die erste, die Offline-Caching unterstützt. Aus dem Internet heruntergeladene Pakete werden bei der nächsten Installation global zwischengespeichert Wenn Sie eine Kopie finden, können Sie diese direkt kopieren. Die npm v5-Version hat das Cache-System neu geschrieben und unterstützt auch die Offline-Installation.Erläuterung 3: Bezüglich der Geschwindigkeit - Parallele Installation
yarn war das erste Unternehmen, das die parallele Installation von Abhängigkeitspaketen unterstützte. Später hat npm auch die parallele Installation optimiert
Erläuterung 4: Nach der Installation von Abhängigkeiten wird das Verzeichnis node_modules automatisch organisiert.
Startzeit: Garn v1.x-Version, npm v4.x-Version.lock
aus dem Projekt gelöscht wird, wird das Verzeichnis node_modules beim Initialisieren der Abhängigkeiten automatisch organisiert; für Versionen vor npm v4.x muss der Benutzer den Befehl npm dedupe Organisieren Sie das Abhängigkeitsverzeichnis.lock
文件,初始化安装依赖时,会自动整理 node_modules 目录;npm v4.x之前版本,需要用户手动执行指令npm dedupe
整理依赖目录对着 pnpm 的成熟,开发者们享受着 pnpm 带来的 更安全、更高速、存储更低耗 等红利,解决了“幽灵依赖” 问题,解决了重复依赖问题
代名词:安全(依赖安装所见即所得)、高速(不重复安装)、存储低耗(硬链接 + 软链接)
代表产物:pnpm
关键特点:
(1)速度极快:存储中心集中管理依赖,直接硬链接到项目的node_modules/.pnpm
【Verifiziert】
(1) Extrem schnell
: Storage Center verwaltet Abhängigkeiten zentral, direkter fester Link zumnode_modules/.pnpm
des Projekts. Im Vergleich zur vorherigen Arbeitsmethode wird eine große Anzahl von E/A-Vorgängen vom Kopieren globaler node_modules in das Projekt reduziert. SoftlinksMaximieren Sie die Wiederverwendung verschiedener Versionen derselben Abhängigkeit: Fügen Sie nur Diff-Dateien hinzu, um verschiedene Versionen zu speichern
(3) Hohe Sicherheit: Die Verzeichnisstruktur node_modules ist die Abhängigkeitsliste package.json, wodurch die „Geisterabhängigkeit“ gelöst wird. Problem
Weitere Informationen zu Knoten finden Sie unter: nodejs-Tutorial!Das obige ist der detaillierte Inhalt vonEin Artikel über die fünf Phasen der Entwicklung der Knotenpaketverwaltung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!