Απαλλαγή από τα node_modules με το Yarn Plug'n'Play

Μειώστε το χρόνο εγκατάστασης έως και 70%. Ρωτήστε με πώς! ;

Όποιος με ξέρει μπορεί να επιβεβαιώσει ότι είμαι μακροχρόνιος λάτρης της JavaScript και ολόκληρου του οικοσυστήματος . Ως μηχανικός Front-end, οι διαχειριστές πακέτων που βασίζονται σε κόμβους αποτελούν καθοριστικό μέρος του συνόλου εργαλείων μου από το 2013.

Πρώτα, χρησιμοποίησα τον Bower, ο οποίος επικεντρώθηκε κυρίως στον κόσμο του front-end. Τότε, το 2015, δυστυχώς (εντάξει, όχι πραγματικά ) συνειδητοποίησα ότι ο Bower πέθανε και ο NPM, ο προεπιλεγμένος διαχειριστής πακέτων για το Node, ήταν ο τρόπος να πάει και για το front-end. Ήταν περίεργο για μένα, αρχικά, να χρησιμοποιώ το NPM για άλλα πράγματα εκτός από τις ενότητες Node, αλλά συνηθίζαμε στην ιδέα και μετανάστευσα άψογα.

Τέλος, μόλις ένα χρόνο αργότερα, το Facebook μας έδωσε το Νήμα, μια σύγχρονη και γρήγορη εναλλακτική λύση έναντι του NPM. Μου άρεσε με την πρώτη ματιά! Αλλά ορισμένα πράγματα ήταν ακόμα προβληματικά…

Κληρονομικά προβλήματα στο Νήμα

Εκτός από την ταχύτητα, το Yarn έφερε πολλά πλεονεκτήματα σε σύγκριση με την έκδοση NPM εκείνη τη στιγμή, όπως αρχεία κλειδώματος, λειτουργία εκτός σύνδεσης, ανθεκτικότητα δικτύου, αθροίσματα ελέγχου και άλλα. Ωστόσο, το Νήμα δανείστηκε μερικά γνωστά προβλήματα από την NPM:

node_modules εδώ, εκεί, παντού

Για κάθε έργο στον υπολογιστή σας που χρησιμοποιεί NPM ή Νήματα, δημιουργείται ένας node_modulesφάκελος. Δεν έχει σημασία αν 10 έργα χρησιμοποιούν την ίδια ακριβώς έκδοση μιας δεδομένης ενότητας, θα αντιγραφούν ξανά και ξανά σε κάθε node_modulesφάκελο αυτών των έργων.

Η δημιουργία ενός νέου φακέλου node_modules απαιτεί πολύ χρόνο

Ακόμα και με ένα μεγάλο άλμα προς τα εμπρός όσον αφορά την ταχύτητα εγκατάστασης, το Νήμα περιορίστηκε από περιορισμούς node_modules. Ακριβώς η δημιουργία του φακέλου node_modules απαιτεί έως και 70% του χρόνου που απαιτείται για την εκτέλεση yarn install(με μια ζεστή προσωρινή μνήμη). Είναι τεράστιος αριθμός αρχείων που δημιουργούνται σε κάθε εγκατάσταση. Λοιπόν, μην το κατηγορείτε στο Νήμα.

Οι εξαρτήσεις δεν προστέθηκαν στο package.json

Ακολουθεί ένα σενάριο για εσάς: Η εφαρμογή σας λειτουργεί τέλεια στην ανάπτυξη, αλλά διακόπτεται η παραγωγή. Μετά από ώρες έρευνας, τελικά καταλαβαίνετε ότι ξεχάσατε να προσθέσετε μια εξάρτηση στο δικό σας package.json. Ναι, μπορεί να συμβεί.

Αργή ανάλυση μονάδας κατά το χρόνο εκτέλεσης

Ο χρόνος εκκίνησης της εφαρμογής σας επηρεάζεται σε μεγάλο βαθμό από τον τρόπο με τον οποίο ο κόμβος επιλύει εξαρτήσεις. Χάνεται χρόνος για την αναζήτηση του συστήματος αρχείων για να ανακαλύψετε από πού θα επιλυθεί μια δεδομένη εξάρτηση.

Νήματα Plug'n'Play για τη διάσωση!

Όλα τα παραπάνω προβλήματα αντιμετωπίστηκαν από την ομάδα Yarn με την κυκλοφορία της λειτουργίας Plug'n'Play τον περασμένο Σεπτέμβριο.

Όταν ενεργοποιείτε το PnP, αντί να αντιγράφετε κάθε απαραίτητο αρχείο από την προσωρινή μνήμη στο node_modulesφάκελο, ακολουθεί αυτό που κάνει το Yarn:

  1. Δημιουργεί ένα μόνο αρχείο με πίνακες στατικής ανάλυσης. Αυτοί οι πίνακες θα περιέχουν πολλές σημαντικές πληροφορίες, όπως: πακέτα διαθέσιμα στο δέντρο εξάρτησης, πώς σχετίζονται μεταξύ τους και τη θέση τους στο δίσκο.
  2. Χρησιμοποιείται μια ειδική λύση για να βοηθήσει τον κόμβο να ανακαλύψει πού έχει εγκατασταθεί κάθε εξάρτηση (κάτω από το φάκελο Yarn cache). Στηρίζεται αποκλειστικά στους πίνακες ανάλυσης που δημιουργήθηκαν προηγουμένως Δεδομένου ότι αυτοί οι πίνακες περιέχουν πληροφορίες σχετικά με ολόκληρο το δέντρο εξάρτησης, η διαδικασία επίλυσης node_modules δεν θα χρειαστεί πλέον να κάνει πολλά statκαι readdirκλήσεις στο χρόνο εκτέλεσης, μειώνοντας σημαντικά τον χρόνο εκκίνησης της εφαρμογής σας. Και καθώς το Νήμα γνωρίζει όλες τις εξαρτήσεις σας, θα παραπονεθεί εάν προσπαθήσετε να εισαγάγετε μια ενότητα που δεν υπάρχει στο package.json:

Χρησιμοποιώντας το νήμα Plug'n'Play

Η μετατροπή ενός έργου για χρήση του PnP είναι εύκολη ως 1-2. Απλώς πρέπει να προσθέσετε μια installConfigενότητα στο δικό σας package.json, με ένα pnpπλήκτρο σε true, όπως αυτό:

{ "installConfig": { "pnp": true }}
Σημείωση: Χρειάζεστε Yarn v1.12 + για να χρησιμοποιήσετε το Plug'n'Play.

Μετά από αυτό, απλώς εκτελέστε yarn installκαι node_modulesθα διαγραφούν όλα μέσα στο φάκελό σας . Από τώρα και στο εξής, κάθε εξάρτηση θα επιλυθεί απευθείας από την καυτή κρυφή μνήμη του Νήματος.

Χρήση του PnP σε ένα νέο έργο React με την εφαρμογή create-react-app

Εάν χρησιμοποιείτε το create-react-app 2+, τα καλά νέα είναι ότι λειτουργεί υπέροχα με το Yarn Plug'n'Play! Απλώς προσθέστε την --use-pnpεπιλογή στην create-react-appεντολή και είστε έτοιμοι:

npx create-react-app your-app-name --use-pnp

Πιθανά προβλήματα

Δεδομένου ότι τίποτα δεν είναι τέλειο στον κόσμο, το PnP ενδέχεται να αντιμετωπίσει νέα προβλήματα όταν χρησιμοποιείται σε έργα που βασίζονται σε μια προσαρμοσμένη λογική εγκατάστασης. Εάν χρειάζεστε περισσότερες πληροφορίες σχετικά με αυτά τα πιθανά νέα ζητήματα, μπορείτε να βρείτε μια λεπτομερή εξήγηση σε αυτό το άρθρο.

συμπέρασμα

Το Plug'n'Play λύνει μερικά πραγματικά ενοχλητικά προβλήματα στο Νήμα. Εκτός αυτού, βελτιώνει δραματικά την εξάρτηση προσωρινής αποθήκευσης σε CI, εξοικονομώντας χρόνο εγκατάστασης και επιτρέποντας στις κατασκευές μας να φτάσουν στο σημείο: εκτέλεση των δοκιμών!

Και αυτό είναι! Διασκεδάστε με το Yarn PnP.