Παρουσιάζοντας το Packem: ένα εξαιρετικά γρήγορο πειραματικό πακέτο γραμμένο στο Rust

Το Packem είναι ένα πειραματικό προ-μεταγλωττισμένο πρόγραμμα δέσμης στοιχείων JavaScript που εφαρμόζεται κυρίως στο Rust Μπορεί επίσης να χειριστεί μια ποικιλία άλλων τύπων αρχείων όπως YAML / TOML, αρχεία shader fragment και πολλά άλλα. Ελέγξτε τον ιστότοπο ή τη σελίδα GitHub για να ξεκινήσετε γρήγορα.

Το Packem επιλύει τις εξαρτήσεις μιας μονάδας και τις ενυδατώνει εκ νέου σε ένα γράφημα λειτουργικής μονάδας, μια επίπεδη λίστα που περιέχει διεπαφές λειτουργικής μονάδας, οι οποίες είναι ουσιαστικά αναφορές σε μεταβλητές δομές δεδομένων που βασίζονται σε σωρό στη μνήμη και περιέχουν ειδικά μεταδεδομένα μιας μονάδας στο γράφημα μονάδας.

Το μεγαλύτερο μέρος της επιχειρησιακής λογικής αφαιρείται σε Rust χρησιμοποιώντας συνδέσεις FFI για να επιτρέψει χαμηλές επιδράσεις μεταξύ των δύο άκρων. Τα Rusty binaries είναι διαθέσιμα ως προσυμπλεγμένα πρόσθετα κόμβου C / C ++ στο repo του Packem. Ένα CI που βασίζεται σε σύννεφο χρησιμοποιείται για την εκτέλεση μερικών σεναρίων με εγκαταστάσεις pre-gyp, αποδίδοντας δυαδικά ειδικά για λειτουργικό σύστημα με υποστήριξη για μεταγενέστερες εκδόσεις κόμβων (8, 9, 10).

Αυτό το επίπεδο του πυρήνα του Packem είναι αυτό που αναφέρεται ως Λογικό πλαίσιο (LC) . Όλες οι άλλες λειτουργίες που δεν έχουν προτεραιότητα ρητώς υποβαθμίζονται στο γενικό χρόνο εκτέλεσης του κόμβου, το οποίο, σύμφωνα με το Packem, είναι το Runtime Context (RC) . Διαβάστε περισσότερα για τα περιβάλλοντα εδώ.

Θεωρητικά, το γράφημα της ενότητας διατηρείται επίπεδο για να αποφευχθούν κοινές παγίδες που θα οδηγούσαν σε περιττές διαβάσεις εάν ένα δέντρο χρησιμοποιήθηκε στη θέση του. Αυτό επιτρέπει στο RC να παρακολουθεί περιπτώσεις όπως βαθιές κυκλικές εξαρτήσεις ή έντονες ένθετες δυναμικές εισαγωγές (διαχωρισμός κώδικα), μεταξύ άλλων, κατάλληλα με ελάχιστες επιπτώσεις απόδοσης ή παρενέργειες όσο το δυνατόν περισσότερο.

Περισσότερες λεπτομέρειες μπορείτε να βρείτε στο README.md του Packem.

Έχω αυτήν την ιδέα στο μυαλό μου αλλά ποτέ δεν σχεδίασα να την εκτελέσω έως ότου ένωσα τις δυνάμεις μου με τον Σαντάμ Μ. Πραγματικά ήταν προς το συμφέρον μου να βλέπω το σύνολο πακέτων ως έννοια ασφαλής για οποιονδήποτε να μάθει, να κατανοήσει και να εφαρμόσει. Το να αγωνίζεσαι ο κόσμος με τις διαμορφώσεις, την τεκμηρίωση και τα πρόσθετα ήταν εξαιρετικά φρικτό και θα ήθελα να εκμεταλλευτώ την ευκαιρία να το αλλάξω αυτό. Μαζί σου. Με το Packem.

Γρήγορη ιστορία

Πήρα λίγο χρόνο για να εξαντλήσω τα περισσότερα πακέτα που γράφτηκαν σε περιβάλλον εκτός JavaScript. Ανακάλυψα ότι οι περισσότεροι ξέχασαν ότι έπρεπε να είναι πακέτο και όχι βιβλιοθήκη C / C ++ από τη σκοτεινή δεκαετία του 19.

Αυτό που ήθελα ήταν ένα bundler που κάνει το μεγαλύτερο μέρος της βαριάς ανύψωσης σε μια γλώσσα κοντά στο μέταλλο για το χρήστη χωρίς να απαιτείται αλληλεπίδραση με τα εσωτερικά του. Τότε βρήκα τον Rust. Μια έξυπνη και συνοπτική γλώσσα συστημάτων που επιδεικνύει αξιέπαινες δυνατότητες, όπως ένα ατρόμητο μοντέλο ταυτότητας, ασφάλεια τύπου και πολλά άλλα! Θα περίμενα πολύ από τη χρήση C / C ++, αλλά θα προτιμούσα να κολλήσω με το Rust, καθώς είναι αρκετά απλό όταν πρόκειται για τη διαχείριση μνήμης.

Γιατί ένας άλλος δέκτης;

Λοιπόν, τι παίρνει εδώ; Γιατί χρειαζόμαστε ένα άλλο εργαλείο δημιουργίας αφού έχουμε ήδη καταπληκτικά, όπως webpack, Parcel, Rollup, κλπ; Θα σας πάρω μαζί με μερικούς λόγους. Ίσως να έχετε τα δικά σας συμφέροντα να μειώσετε σημαντικά τους χρόνους ανάπτυξης και παραγωγής.

Είναι το 2019, δεν χρειαζόμαστε πλέον αργά εργαλεία

Παρόλο που το Packem είναι ταχύτερο από το webpack 4, είναι διπλάσιο από το Parcel (με συλλογή πολλών πυρήνων) . Σε μια δοκιμή συγκριτικής αξιολόγησης, ομαδοποιήσαμε το Lodash v4.17.1 με το Packem και το Parcel και αυτό ήταν το αποτέλεσμα:

Ποτέ μην πάρετε καθίσματα στην ονομαστική αξία. Μπορείτε να το δοκιμάσετε μόνοι σας εδώ.

Ο λόγος για τον οποίο δεν ενοχλούσα τη συγκριτική αξιολόγηση του Parcel έναντι του webpack ήταν επειδή το webpack 4 είναι βαθύτερα ταχύτερο από το Parcel. Το απέδειξα αυτό χρησιμοποιώντας τα παγκάκια του Sean T. Larkin και ένα νήμα στο Twitter μπορεί να βρεθεί εδώ.

Επειδή μπορούμε. Ο καθένας μπορεί, σωστά;

Φυσικά, αυτό που θα έχει τη μεγαλύτερη σημασία, είναι επειδή μπορούμε . Είχαμε την ιδέα να έχουμε ταχύτερους χρόνους πακέτου με μια διεπαφή Rusty είτε με FFI είτε WASM (δεν ήταν ακόμα σίγουρη μέχρι τότε). Το FFI ήταν πιο λογικό όσον αφορά την ταχύτητα και το DX, οπότε πήγαμε με την εφαρμογή του Packem σε δεσμεύσεις Rust FFI.

Αντιμετωπίσαμε μερικά θέματα που σχετίζονται με θέματα, οπότε δεν χρησιμοποιήσαμε πολύ τους διαθέσιμους πόρους. Ως αποτέλεσμα, χρησιμοποιήσαμε πολλαπλές διεργασίες θυγατρικών κόμβων (με κόμβο-εργαζόμενος-αγρόκτημα ) , την ίδια τεχνική που χρησιμοποιεί το Parcel για τη συλλογή πολλών πυρήνων, αλλά για μεγαλύτερα γραφήματα λειτουργικών μονάδων καθώς προσθέτει σημαντικό χρόνο εκκίνησης πάνω από το χρόνο λειτουργίας του κόμβου όταν χρησιμοποιείται με μικρότερα γραφήματα λειτουργικών μονάδων .

Στυλ διαμόρφωσης

Αυτό ήταν ένα δύσκολο μέρος. Υπήρχαν πολλές ερωτήσεις που χρειάζονταν μια καλή απάντηση για να επιλέξουν το σωστό στυλ διαμόρφωσης. Στατικό ή δυναμικό; JSON / YAML / TOML; Η επιλογή μας βασίστηκε εξ ολοκλήρου στο αν χρειαζόμασταν το Packem για:

  1. Έχετε ένα πιο όμορφο στυλ διαμόρφωσης και
  2. Να είστε αγνωστικοί για άλλες προσαρμοσμένες διαμορφώσεις χρηστών όπως .babelrc ή package.json .

Κατώτατη γραμμή, προχωρήσαμε με ένα στατικό στυλ διαμόρφωσης αφού το βρήκαμε ακριβώς αυτό που χρειαζόμασταν. Κάτι που θα μπορούσε δηλωτικά να πει στον Packem πώς να διαχειριστεί τον κύκλο πακέτων . Όλα τα όρια για τη στατική διαμόρφωση έγιναν σαφή.

Μια άλλη πτυχή του ενδιαφέροντος ήταν ο τύπος αρχείου που πρέπει να χρησιμοποιήσουμε για τη διαμόρφωση. JSON που είναι πιο κοινό σε μια συντριπτική πλειοψηφία προγραμματιστών JavaScript ή σε στυλ YAML / TOML / XML που είναι λιγότερο κοινά αλλά έχουν τα δικά τους πλεονεκτήματα. Υποβλήθηκε ακόμη πρόταση για υποστήριξη JSON (# 5).

Το JSON απλώς δεν έκοψε λόγω όλων των περιττών εισαγωγικών συμβολοσειρών, σγουρών & μπλουζών, κάτι που έχει νόημα αφού είναι μια μορφή ανταλλαγής δεδομένων . Μια προσέγγιση XML-ish δεν αξίζει σεβασμό όσον αφορά τη χρήση ως μορφή διαμόρφωσης, καθώς κάνει τα πράγματα χειρότερα από το JSON όσον αφορά τους περιττούς χαρακτήρες. Η TOML παρουσίασε πολλές νέες γραμμές και ο εντοπισμός σφαλμάτων ένθετων επιλογών δεν φαινόταν ελκυστικός, καθώς γνωρίζαμε ότι τα πρόσθετα Packem θα μπορούσαν να πάρουν πραγματικά εντυπωσιακά.

Ο τελικός νικητής ήταν ο YAML! Ήταν σε θέση να περάσει από όλες τις πτυχές του να είναι μια σωστή μορφή διαμόρφωσης (τουλάχιστον για το Packem). Το:

  1. Κάνει τη διαμόρφωση ανώδυνη.
  2. Χρησιμοποιεί μια κομψή προσέγγιση.
  3. Εξακολουθεί να είναι εξοικειωμένο με το JavaScript
  4. Σχεδιάστηκε ειδικά για αυτήν τη θήκη χρήσης (διαμορφώσεις) .

Ακολουθεί ένα παράδειγμα τυπικής διαμόρφωσης Packem ( packem.config.yml) . Ελέγξτε μόνοι σας και σκεφτείτε να γράψετε το ίδιο περιεχόμενο σε στυλ JSON / TOML / XML-ish.

FYI, είναι απαραίτητες μόνο οι δύο πρώτες επιλογές! ;

Επέκταση του Packem

Αυτή η δυνατότητα δεν έχει ακόμη εφαρμοστεί.

Μερικές φορές ίσως χρειαστεί να χρησιμοποιήσουμε μια δυνατότητα που δεν υπάρχει ακόμη , ενδέχεται να μην εφαρμοστεί στο Packem ή να είναι πολύ συγκεκριμένη για το έργο μας . Για αυτήν την περίπτωση, θα έχετε δύο τρόπους για να λύσετε τις ανάγκες σας:

  1. Δημιουργήστε ένα πρόσθετο Packem για τη θήκη χρήσης σας (που είναι η συνιστώμενη επιλογή).
  2. Δημιουργήστε ένα προσαρμοσμένο RC πάνω από τα δυαδικά αρχεία του Packem.

Η χρήση του Rust μας δίνει την ευκαιρία να μεταρρυθμίσουμε το LC σε άλλες δυαδικές μορφές, όπως το WebAssembly, που θα επιτρέψουν στο Packem να εμφανίσει πολλαπλούς στόχους μεταγλώττισης:

  1. Ένα πρόσθετο C / C ++ που βασίζεται σε NAPI με δυαδικά ειδικά για πλατφόρμα που απαιτούνται από το προεπιλεγμένο RC της Packem.
  2. Ένα δυαδικό βασισμένο στο WebAss Assembly που είναι πολλαπλής πλατφόρμας και εισάγεται στο RC.
  3. Το προεπιλεγμένο αυτόνομο Packem που χρησιμοποιεί WebAssembly με εφαρμογή συμβατή με πρόγραμμα περιήγησης του RC.
Οι δύο τελευταίες δεν είναι ακόμα στο ραντάρ, καθώς οι εσωτερικές αναδιαρθρώσεις εξακολουθούν να διευθετούνται.

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

  1. Μπορείτε ακόμα να αγκαλιάσετε το σύστημα προσθηκών της Packem, καθώς θα σας επιτρέψει να ενσωματώσετε το οικοσύστημα των προσθηκών της Packem με το προσαρμοσμένο πρόγραμμα δέσμευσης.
  2. Εάν δεν είστε βέβαιοι αν θα χρειαστεί να δημιουργήσετε ένα προσαρμοσμένο bundler, γνωρίζετε ότι δεν θα χρειαζόταν πάντα. Δοκιμάστε να υποβάλετε πρώτα ένα ζήτημα.
  3. Είναι εγγύηση ότι αυτά τα δυαδικά αρχεία θα επιταχύνουν τη ροή εργασίας σας ανάλογα με τις συγκεκριμένες περιπτώσεις χρήσης.

Τωρινή κατάσταση

  • ✂ Διαχωρισμός κώδικα για τρόπους ανάπτυξης και παραγωγής.
  • ; Βελτιωμένο CLI (`- verbose`) για καλύτερες πληροφορίες σχετικά με τον κύκλο bundling.
  • ; Module Interfaces για να επιτρέπεται ο εύκολος χειρισμός του γραφικού στοιχείου.
  • ✔ Σωστή προτεραιότητα. Οι εγγενείς λειτουργίες ταιριάζουν απόλυτα στο LC. Αυτό σημαίνει ότι υπάρχουν μεγαλύτερες πιθανότητες ταχείας δημιουργίας.
  • ; Εξαγωγή N ativeUtils για εξωτερική χρήση εγγενών λειτουργιών, συμπεριλαμβανομένου του g enerateModuleGraph που εκτελεί ξανά τη διαδικασία δημιουργίας ενός γραφήματος λειτουργικής μονάδας. Είναι βαρύ, αλλά εξακολουθεί να είναι χρήσιμο σε περιπτώσεις όπου θα χρειαστείτε έναν κλώνο του τρέχοντος ενεργού γραφήματος λειτουργικής μονάδας. Χρησιμοποιώντας αυτό σημαίνει διπλασιασμός του χρόνου κατασκευής, οπότε χρησιμοποιήστε τον με προσοχή.

Τι έπεται?

Αυτά είναι τα χαρακτηριστικά που ελπίζουμε να έχουμε σύντομα στις επερχόμενες κυκλοφορίες. Με τις προσπάθειές σας θα μπορούσαμε να ολοκληρώσουμε τη δέσμευση με τον σωστό τρόπο . Όταν το Packem είναι στο 1.0 , περιμένουμε να έχουμε πλήρη υποστήριξη για όλες τις δυνατότητες που αναφέρονται παρακάτω και τις άλλες που αναφέρονται στον χάρτη πορείας του Packem.

  • Αυτόνομο πρόγραμμα περιήγησης Packem με το LC στο WebAss Assembly για στενότερη ενσωμάτωση με το υποκείμενο σύστημα. Η Axel Rauschmayer έχει ήδη υποβάλει ένα αίτημα λειτουργίας για να έχει μια έκδοση συμβατή με Node στο WASM. Για το δίσκο, θα δουλέψουμε και στα δύο σύντομα.
  • Τρέξιμο, αλλά προχωρημένο. Η επίλυση των εισαγόμενων / ανώνυμων εισαγωγών και η απομάκρυνση του νεκρού κώδικα θα πρέπει να είναι αεράκι. Αυτό σημαίνει ότι μπορείτε να χρησιμοποιήσετε βιβλιοθήκες, όπως lodash αντί για lodash-es, χωρίς να ανησυχείτε αν ο κώδικάς σας θα είναι αλλοιωμένος ή όχι.
  • Αυτόματη διαμόρφωση. Όπως το Zero Config, αλλά προεπιλεγμένο για επιπλέον ευελιξία.
  • Προηγμένες επιλογές CLI για να κάνουν την ανάπτυξη με το Packem δεύτερη φύση.
  • Καλύτερη αναφορά σφαλμάτων.
  • Περισσότεροι περιβαλλοντικοί στόχοι. Το Packem μπορεί να γίνει δέσμη μόνο για το πρόγραμμα περιήγησης από τώρα. Τελικά, αναμένουμε να υποστηρίξουμε επίσης τον κόμβο CJS και άλλες μορφές.
  • Περισσότερα πρόσθετα. Χρειαζόμαστε περισσότερα πρόσθετα! Το Packem διαθέτει ένα σύνολο κοινών προσθηκών για να ξεκινήσετε πιο γρήγορα. Αλλά για να αναπτύξουμε μια κοινότητα, θα χρειαστούμε ένα υπέροχο οικοσύστημα προσθηκών. Ελέγξτε τις διαθέσιμες κοινές προσθήκες ή την ενότητα προσθηκών στον ιστότοπο για να ξεκινήσετε αμέσως την ανάπτυξη μιας προσθήκης.
  • Και πολλα ΑΚΟΜΑ…

Πόροι

  • Packem στο GitHub
  • Αιτήματα οδικού χάρτη και λειτουργιών
  • Επίσημος ιστότοπος της Packem
  • Δημιουργία προσθηκών με το Packem
  • Διαχωρισμός κώδικα με Packem
  • Το γράφημα της ενότητας

Το Packem δεν έχει φτάσει ακόμη στο 1.0 . Εάν έχετε διαπιστώσει ότι το Packem σας ενδιαφέρει καθόλου, δοκιμάστε να συνεισφέρετε στο ίδιο το Packem δημιουργώντας πρόσθετα, ενημερώνοντας την τεκμηρίωση, υποστηρίζοντάς μας οικονομικά, εκπροσωπώντας το Packem σε συνέδρια ή με οποιοδήποτε άλλο τρόπο. Σας ευχαριστούμε για τις προσπάθειές σας!

Καλή ομάδα! ???