Wenn Sie Koch in einem gehobenen Michelin-Stern-Restaurant wären, würden Sie Gemüse und Fleisch aus zufälligen, nicht verifizierten Quellen kaufen? Die Kosten fast jedes durchschnittlichen Projekts belaufen sich auf Hunderttausende oder sogar Millionen Dollar. Ich glaube, dass unsere Branche den gleichen Ansatz verfolgen sollte wie Restaurants.
Die erste Frage, die Sie sich gleich stellen sollten: Brauchen Sie wirklich eine neue Abhängigkeit? Könnte das Problem mit der aktuellen Umgebung, z. B. der Sprache oder den installierten Bibliotheken, gelöst werden? Beispielsweise muss keine zusätzliche Bibliothek installiert werden, um UUIDs zu generieren. Node.js und Browser unterstützen es sofort: crypto.randomUUID()
Die zweite Frage: Brauchen Sie die gesamte Bibliothek? Wenn Sie beispielsweise nur ein Dropdown-Menü benötigen, lohnt es sich dann, etwas wie Bootstrap zu installieren? Vielleicht ist es besser, sich auf eine einzige, fokussierte Bibliothek mit einer nicht gestalteten Dropdown-Komponente von Radix UI zu beschränken?
Okay. Wir haben einige Kandidaten im Auge. Wie wählen wir also das Richtige aus?
Eine schön formatierte README-Datei? Ein bekannter Name? Mehr Forks, Sterne und Downloads als andere? Leider reichen diese Faktoren allein nicht aus. Hier wählen wir einen Dienstleister aus. Wir möchten, dass auftretende Probleme schnell gelöst werden, die Funktionalität auf dem neuesten Stand bleibt und vor allem, dass der Service sicher und zuverlässig ist. Einfache externe Kennzahlen geben nicht immer Aufschluss über die Qualität oder langfristige Eignung. Bevor wir das installieren, was wir im Repository-Katalog gefunden haben, wäre es toll, das GitHub-Repository zu besuchen und seinen Inhalt zu analysieren.
Ich habe eine Liste mit Kriterien erstellt, die ich in den letzten Jahren verwendet habe. Ich hoffe, sie helfen Ihnen bei der Auswahl der am besten geeigneten Bibliotheken. Es ist wichtig, sie umfassend zu berücksichtigen und bei der Wahl zwischen ihnen in manchen Fällen Kompromisse einzugehen.
Haftungsausschluss: Ich kritisiere die unten genannten Bibliotheken nicht und versuche auch nicht, von ihrer Nutzung abzuraten. In einigen Fällen habe ich absichtlich Namen weggelassen, um mich auf das Kriteriumsbeispiel zu konzentrieren und gleichzeitig die sachliche Genauigkeit zu wahren.
Wie sicher ist die Anwendung? Es mag wie eine Fiktion klingen, aber ja, Abhängigkeiten können gefährlich sein. Beispielsweise wurde einer Bibliothek mit 500.000 Downloads eine interessante Funktion hinzugefügt : Sie versucht, alle Dateien auf dem Computer durch ❤️ zu ersetzen, wenn Ihre IP-Adresse in einen bestimmten Bereich fällt.
Eine interessante Tatsache ist, dass diese Abhängigkeit in vue-cli verwendet wurde. Wie können wir solche Probleme entdecken? Sehen Sie sich die Problemseite an oder versuchen Sie, nach dem Namen der Bibliothek zu googeln. Normalerweise tauchen solche Informationen schnell auf.
Wann war die letzte Veröffentlichung? Wie oft kommt es zu Veröffentlichungen? Regelmäßige Releases stellen sicher, dass Probleme behoben werden und Updates sich ständig ändernde Technologien unterstützen. Im Rahmen der mobilen Entwicklung sorgen regelmäßige Releases auch dafür, dass das Projekt erfolgreich kompiliert werden kann.
Hier ist ein Beispiel aus der Welt von Go: Die Autoren einer Bibliothek mit 18,2K Sternen beschlossen, die Pflege ihrer Abhängigkeit einzustellen und archivierten sie. Das bedeutet, dass der Mangel an Support und Updates in einigen Jahren zum Problem werden wird. Stellen Sie sich nun vor, Sie installieren eine ähnliche Abhängigkeit, ohne vorher GitHub zu überprüfen. Es geht darum, das Verfallsdatum von Produkten zu überprüfen.
Hier ist ein Beispiel für häufig gute Veröffentlichungen:
Wie ist das Verhältnis von offenen zu geschlossenen Problemen? Wie bereit sind die Autoren, Änderungen zu akzeptieren? Es ist möglich, dass Sie eines Tages etwas beisteuern müssen. Diese Bibliothek ist beispielsweise sehr beliebt und weist einen Anteil geschlossener Ausgaben von 98 % auf. Nur 18 sind geöffnet.
Wie schnell werden kritische Probleme gelöst? Einmal habe ich mich für einen ORM mit 31.000 Sternen entschieden, aber irgendwann stießen wir auf ein Problem, das uns blockierte. Wir mussten nach Workarounds suchen und schließlich auf eine andere Lösung umsteigen. Leider sind fast vier Jahre vergangen und das Problem ist immer noch nicht gelöst.
Solche Probleme können durch Sortieren nach den am häufigsten kommentierten Themen identifiziert werden.
Wurde der Beitragsprozess von den Erstellern organisiert? Gibt es einen klaren, definierten Arbeitsablauf? Beispielsweise haben die Macher von Next.js sogar ein 40-minütiges Video über ihren Beitragsprozess aufgenommen.
Ja, es mag viel Code geben, aber es ist immer möglich, seine verschiedenen Teile zu untersuchen. Wie ist das Projekt organisiert? Ist es verständlich und gut strukturiert und gelten bewährte Verfahren? Je schlechter der Code geschrieben ist, desto höher ist die Wahrscheinlichkeit, dass das Projekt in Zukunft scheitert. Viele kleine Kandidaten sind für mich zu diesem Zeitpunkt ausgeschieden.
Bietet die Bibliothek Tests an? Wie hoch ist die Testabdeckung? Wie wurden die Tests geschrieben? Selbst wenn Betreuer Zusammenführungsanfragen prüfen, besteht die Möglichkeit, dass etwas übersehen wird. Es gibt viele verschiedene Menschen, die zur Bibliothek beitragen. Normalerweise werden Informationen zur Testabdeckung auf Abzeichen oben im Repository angezeigt. Ist dies jedoch nicht der Fall, können wir jederzeit im Projekt nach Tests suchen. Beispielsweise verfügt die Bibliotheksfamilie formatjs
über eine hervorragende Testabdeckung und umfasst verschiedene Arten von Tests.
Mobile Anwendungen weisen oft große Abhängigkeiten auf und die gesamte App kann sogar mehr als 200 MB groß sein, was beim Herunterladen über Mobilfunknetze zu Problemen führen und viel Speicherplatz verbrauchen kann. Dies ist besonders problematisch für Front-End-CSR-Apps, bei denen langsame Internetgeschwindigkeiten die Ladezeiten dramatisch verlängern können.
Für Webprojekte gibt es ein tolles Tool zur Bestimmung von Paketgrößen: https://bundlephobia.com . Natürlich kann die Größe durch serverseitiges Rendering und Tree-Shaking verringert werden, dies muss jedoch immer überprüft werden.
Ein beliebtes Beispiel sind Datumsmanipulationsbibliotheken. Die von dayjs (2,9 KB) bereitgestellte Funktionalität könnte ausreichend sein, sodass die Installation von moment.js (72,1 KB) oder date-fns (26,8 KB) entfällt.
Alle oben aufgeführten Punkte werden bis zu einem gewissen Grad mit der Anzahl der Abhängigkeiten im gesamten Abhängigkeitsbaum des Projekts multipliziert. Ein großartiges Tool zum Überprüfen des vollständigen Abhängigkeitsbaums: https://npm.anvaka.com
Haben Sie jemals darüber nachgedacht? Ich hatte es auch nicht. Beispielsweise ermöglichen die MIT- und Apache 2.0-Lizenzen die kostenlose Nutzung von Bibliotheken in kommerziellen Projekten, während für einige GPL v2-Lizenzen spezifische Anforderungen und Einschränkungen gelten. In einem unserer Projekte ließen wir von einem Anwalt eine Tabelle erstellen, um alle Lizenzen unseres Abhängigkeitsbaums zu überprüfen. Wenn Ihnen also etwas Ungewöhnliches an einer Lizenz auffällt, ist es besser, einen Anwalt zu konsultieren, um Probleme bei einer Prüfung zu vermeiden. Mit dem Dienstprogramm legally können wir alle Lizenzen aus vorhandenen NPM-Abhängigkeiten extrahieren. PS: Ich bin kein Anwalt und das war keine Rechtsberatung. Es ist ein seltener und spezieller Fall, dass etwas aufgrund der Lizenz nicht geeignet ist, aber es ist trotzdem möglich.
Vielen Dank, dass Sie meinen Artikel gelesen haben! Der Kernpunkt dabei war, Beispiele aus der Praxis aufzuzeigen, dass eine oberflächliche und schnelle Entscheidungsfindung manchmal nicht zur besten Option führen kann. Wenn Sie diese Kriterien berücksichtigen, können Sie eine fundiertere Entscheidung treffen.
Bitte zögern Sie nicht, Kommentare oder Vorschläge zu hinterlassen. Zögern Sie nicht, Ihre Erfahrungen auch in den Kommentaren zu teilen. Ihre Likes und Kommentare inspirieren mich, neue Artikel zu schreiben. Viel Spaß beim Kochen :)