Προγραμματισμός

Τι είναι το Node.js; Ο χρόνος εκτέλεσης JavaScript εξηγείται

Η δυνατότητα κλιμάκωσης, η καθυστέρηση και η απόδοση είναι βασικοί δείκτες απόδοσης για διακομιστές ιστού. Η διατήρηση της καθυστέρησης χαμηλής και της απόδοσης υψηλής κατά την αναβάθμιση και την έξοδο δεν είναι εύκολη. Το Node.js είναι ένα περιβάλλον χρόνου εκτέλεσης JavaScript που επιτυγχάνει χαμηλό λανθάνοντα χρόνο και υψηλή απόδοση, ακολουθώντας μια προσέγγιση «μη αποκλεισμού» στην εξυπηρέτηση αιτημάτων. Με άλλα λόγια, το Node.js δεν σπαταλά χρόνο ή πόρους για να περιμένει την επιστροφή αιτημάτων εισόδου / εξόδου.

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

Κατά την αναπαραγωγή νήματα δημιουργεί λιγότερη μνήμη και γενικά επεξεργαστή από το forking διαδικασίες, μπορεί ακόμα να είναι αναποτελεσματικό. Η παρουσία ενός μεγάλου αριθμού νημάτων μπορεί να προκαλέσει ένα πολύ φορτωμένο σύστημα να ξοδέψει πολύτιμους κύκλους στον προγραμματισμό νημάτων και την αλλαγή περιβάλλοντος, γεγονός που προσθέτει καθυστέρηση και επιβάλλει όρια στην επεκτασιμότητα και την απόδοση.

Το Node.js ακολουθεί μια διαφορετική προσέγγιση. Εκτελεί έναν βρόχο συμβάντος με ένα νήμα που είναι εγγεγραμμένος στο σύστημα για τη διαχείριση συνδέσεων και κάθε νέα σύνδεση προκαλεί JavaScript συνάρτηση επανάκλησης στη φωτιά. Η συνάρτηση επανάκλησης μπορεί να χειριστεί αιτήματα με μη αποκλεισμούς κλήσεων εισόδου / εξόδου και, εάν είναι απαραίτητο, μπορεί να δημιουργήσει κλωστές από μια ομάδα για να εκτελέσει λειτουργίες αποκλεισμού ή εντάσεως CPU και να ισορροπήσει φορτίο μεταξύ πυρήνων CPU. Η προσέγγιση του κόμβου για κλιμάκωση με λειτουργίες επανάκλησης απαιτεί λιγότερη μνήμη για τον χειρισμό περισσότερων συνδέσεων από τις περισσότερες ανταγωνιστικές αρχιτεκτονικές που κλιμακώνονται με νήματα, συμπεριλαμβανομένων των Apache HTTP Server, των διαφόρων διακομιστών εφαρμογών Java, IIS και ASP.NET και Ruby on Rails.

Το Node.js αποδεικνύεται πολύ χρήσιμο για εφαρμογές επιτραπέζιων υπολογιστών εκτός από διακομιστές. Σημειώστε επίσης ότι οι εφαρμογές κόμβου δεν περιορίζονται σε καθαρή JavaScript. Μπορείτε να χρησιμοποιήσετε οποιαδήποτε γλώσσα μεταφέρεται σε JavaScript, για παράδειγμα TypeScript και CoffeeScript. Το Node.js ενσωματώνει τη μηχανή JavaScript του Google Chrome V8, η οποία υποστηρίζει τη σύνταξη ECMAScript 2015 (ES6) χωρίς καμία ανάγκη για έναν μεταφορέα ES6-προς-ES5 όπως το Babel.

Μεγάλο μέρος του βοηθητικού προγράμματος Node προέρχεται από τη μεγάλη βιβλιοθήκη πακέτων, η οποία είναι προσβάσιμη από το npm εντολή. Το NPM, ο διαχειριστής πακέτων Node, είναι μέρος της τυπικής εγκατάστασης Node.js, αν και έχει τη δική του ιστοσελίδα.

Κάποιο ιστορικό JavaScript

Το 1995, ο Brendan Eich, τότε εργολάβος της Netscape, δημιούργησε τη γλώσσα JavaScript για να εκτελείται σε προγράμματα περιήγησης στο Web — σε 10 ημέρες, όπως εξηγεί η ιστορία. Το JavaScript προοριζόταν αρχικά να επιτρέψει κινούμενες εικόνες και άλλους χειρισμούς του μοντέλου αντικειμένου εγγράφου προγράμματος περιήγησης (DOM). Λίγο αργότερα, παρουσιάστηκε μια έκδοση JavaScript για τον Netscape Enterprise Server.

Το όνομα JavaScript επιλέχθηκε για σκοπούς μάρκετινγκ, καθώς η γλώσσα Java της Sun ήταν ευρέως υποθετική εκείνη την εποχή. Στην πραγματικότητα, η γλώσσα JavaScript βασίστηκε στην αρχή κυρίως στις γλώσσες Scheme και Self, με επιφανειακή σημασιολογία Java.

Αρχικά, πολλοί προγραμματιστές απέρριψαν τη JavaScript ως άχρηστη για «πραγματική δουλειά» επειδή ο διερμηνέας της έτρεξε μια τάξη μεγέθους πιο αργά από τις μεταγλωττισμένες γλώσσες. Αυτό άλλαξε καθώς αρκετές ερευνητικές προσπάθειες με στόχο την ταχύτερη JavaScript άρχισαν να αποφέρουν καρπούς. Πιο εμφανώς, ο ανοιχτός κώδικας Google Chrome V8 JavaScript, ο οποίος πραγματοποιεί σύνταξη, inline και βελτιστοποίηση δυναμικού κώδικα, μπορεί να ξεπεράσει τον κώδικα C ++ για ορισμένα φορτία και ξεπερνά την Python για τις περισσότερες περιπτώσεις.

Η πλατφόρμα Node.js που βασίζεται σε JavaScript παρουσιάστηκε το 2009, από τον Ryan Dahl, για Linux και MacOS, ως μια πιο επεκτάσιμη εναλλακτική λύση για τον διακομιστή Apache HTTP. Το NPM, που γράφτηκε από τον Isaac Schlueter, κυκλοφόρησε το 2010. Μια εγγενής έκδοση των Windows του Node.js έκανε το ντεμπούτο του το 2011.

Η Joyent κατείχε, κυβερνούσε και υποστήριξε την αναπτυξιακή προσπάθεια του Node.js για πολλά χρόνια. Το 2015, το έργο Node.js μεταφέρθηκε στο Ίδρυμα Node.js και διοικείται από την τεχνική διευθύνουσα επιτροπή του ιδρύματος. Το Node.js αγκάλιασε επίσης ως Linux Foundation Collaborative Project. Το 2019, το Ίδρυμα Node.js και το Ίδρυμα JS συγχωνεύθηκαν για να σχηματίσουν το Ίδρυμα OpenJS.

Βασική αρχιτεκτονική Node.js

Σε υψηλό επίπεδο, το Node.js συνδυάζει τη μηχανή JavaScript Google V8, έναν βρόχο συμβάντος χωρίς αποκλεισμό με νήμα και ένα API I / O χαμηλού επιπέδου. Ο απογυμνωμένος κώδικας παραδείγματος που φαίνεται παρακάτω απεικονίζει το βασικό μοτίβο διακομιστή HTTP, χρησιμοποιώντας λειτουργίες βέλους ES6 (ανώνυμες λειτουργίες Lambda που δηλώνονται χρησιμοποιώντας τον τελεστή λίπους, =>) για τις επιστροφές κλήσεων.

Η αρχή του κώδικα φορτώνει τη μονάδα HTTP, ορίζει το διακομιστή όνομα κεντρικού υπολογιστή μεταβλητή σε localhost (127.0.0.1) και ορίζει το Λιμάνι μεταβλητή σε 3000. Στη συνέχεια, δημιουργεί έναν διακομιστή και μια συνάρτηση επανάκλησης, σε αυτήν την περίπτωση μια συνάρτηση λίπους βέλους που επιστρέφει πάντα την ίδια απάντηση σε οποιοδήποτε αίτημα: statusCode 200 (επιτυχία), απλό κείμενο τύπου περιεχομένου και απόκριση κειμένου του "Γεια σου Κόσμος \ n". Τέλος, λέει στον διακομιστή να ακούσει localhost θύρα 3000 (μέσω υποδοχής) και ορίζει μια επιστροφή κλήσης για την εκτύπωση ενός μηνύματος καταγραφής στην κονσόλα όταν ο διακομιστής έχει αρχίσει να ακούει. Εάν εκτελείτε αυτόν τον κωδικό σε τερματικό ή κονσόλα χρησιμοποιώντας το κόμβος εντολή και, στη συνέχεια, περιηγηθείτε στο localhost: 3000 χρησιμοποιώντας οποιοδήποτε πρόγραμμα περιήγησης Web στον ίδιο υπολογιστή, θα δείτε το "Hello World" στο πρόγραμμα περιήγησής σας. Για να σταματήσετε τον διακομιστή, πατήστε Control-C στο παράθυρο του τερματικού.

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

Η βιβλιοθήκη Node.js

Όπως μπορείτε να δείτε στην αριστερή πλευρά του παρακάτω σχήματος, το Node.js διαθέτει ένα μεγάλο εύρος λειτουργιών στη βιβλιοθήκη του. Η ενότητα HTTP που χρησιμοποιήσαμε στο δείγμα κώδικα προηγουμένως περιέχει τάξεις πελάτη και διακομιστή, όπως μπορείτε να δείτε στη δεξιά πλευρά του σχήματος. Η λειτουργικότητα του διακομιστή HTTPS που χρησιμοποιεί TLS ή SSL ζει σε μια ξεχωριστή ενότητα.

Ένα εγγενές πρόβλημα με έναν βρόχο συμβάντος με ένα νήμα είναι η έλλειψη κάθετης κλιμάκωσης, καθώς το νήμα βρόχου συμβάντος θα χρησιμοποιεί μόνο έναν πυρήνα CPU. Εν τω μεταξύ, τα σύγχρονα τσιπ CPU συχνά εκθέτουν οκτώ ή περισσότερους πυρήνες και τα σύγχρονα ράφια διακομιστών έχουν συχνά πολλά τσιπ CPU. Μια εφαρμογή με ένα νήμα δεν θα εκμεταλλευτεί πλήρως τους πυρήνες 24-plus σε ένα ισχυρό rack διακομιστή.

Μπορείτε να το διορθώσετε, αν και χρειάζεται κάποιος επιπλέον προγραμματισμός. Κατ 'αρχάς, το Node.js μπορεί να γεννήσει τις διαδικασίες του παιδιού και να συντηρήσει σωλήνες μεταξύ του γονέα και των παιδιών, παρόμοια με τον τρόπο που το σύστημα ποπ (3) η κλήση λειτουργεί, χρησιμοποιώντας child_process.spawn () και σχετικές μεθόδους.

Η ενότητα συμπλέγματος είναι ακόμη πιο ενδιαφέρουσα από τη θυγατρική μονάδα επεξεργασίας για τη δημιουργία κλιμακούμενων διακομιστών. ο cluster.fork () Η μέθοδος δημιουργεί διαδικασίες εργαζομένων που μοιράζονται τις θύρες διακομιστή του γονέα, χρησιμοποιώντας child_process.spawn () κάτω από τα καλύμματα. Το master cluster κατανέμει τις εισερχόμενες συνδέσεις μεταξύ των εργαζομένων του χρησιμοποιώντας, από προεπιλογή, έναν αλγόριθμο round-robin που είναι ευαίσθητος στα φορτία της διαδικασίας εργαζομένων.

Σημειώστε ότι το Node.js δεν παρέχει λογική δρομολόγησης. Αν θέλετε να διατηρήσετε την κατάσταση σε όλες τις συνδέσεις σε ένα σύμπλεγμα, θα πρέπει να διατηρήσετε την περίοδο σύνδεσης και τα αντικείμενα σύνδεσης σε κάποιο μέρος εκτός από τη μνήμη RAM του εργαζομένου.

Το οικοσύστημα πακέτων Node.js

Το μητρώο NPM φιλοξενεί περισσότερα από 1,2 εκατομμύρια πακέτα δωρεάν, επαναχρησιμοποιήσιμου κώδικα Node.js, γεγονός που το καθιστά το μεγαλύτερο μητρώο λογισμικού στον κόσμο. Σημειώστε ότι τα περισσότερα NPM πακέτα (ουσιαστικά φάκελοι ή στοιχεία μητρώου NPM που περιέχουν ένα πρόγραμμα που περιγράφεται από ένα αρχείο package.json) περιέχουν πολλά ενότητες (προγράμματα με τα οποία φορτώνετε απαιτώ δηλώσεις). Είναι εύκολο να συγχέουμε τους δύο όρους, αλλά σε αυτό το πλαίσιο έχουν συγκεκριμένες έννοιες και δεν πρέπει να εναλλάσσονται.

Το NPM μπορεί να διαχειριστεί πακέτα που είναι τοπικές εξαρτήσεις ενός συγκεκριμένου έργου, καθώς και παγκοσμίως εργαλεία JavaScript. Όταν χρησιμοποιείται ως διαχειριστής εξάρτησης για ένα τοπικό έργο, το NPM μπορεί να εγκαταστήσει, με μία εντολή, όλες τις εξαρτήσεις ενός έργου μέσω του αρχείου package.json. Όταν χρησιμοποιείται για καθολικές εγκαταστάσεις, το NPM απαιτεί συχνά δικαιώματα συστήματος (sudo).

Δεν το κάνεις έχω για να χρησιμοποιήσετε τη γραμμή εντολών NPM για πρόσβαση στο δημόσιο μητρώο NPM. Άλλοι διαχειριστές πακέτων όπως το Yarn του Facebook προσφέρουν εναλλακτικές εμπειρίες από την πλευρά του πελάτη. Μπορείτε επίσης να αναζητήσετε και να αναζητήσετε πακέτα χρησιμοποιώντας τον ιστότοπο NPM.

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

Για παράδειγμα, το πλαίσιο Express, ένα ελάχιστο και ευέλικτο πλαίσιο εφαρμογών ιστού Node.js, παρέχει ένα ισχυρό σύνολο δυνατοτήτων για τη δημιουργία μονών και πολλών σελίδων και υβριδικών εφαρμογών ιστού. Ενώ το αποθετήριο Expresscode με δυνατότητα κλωνοποίησης βρίσκεται στη διεύθυνση //github.com/expressjs/express και η τεκμηρίωση Express βρίσκεται στη διεύθυνση //expressjs.com/, ένας γρήγορος τρόπος για να ξεκινήσετε να χρησιμοποιείτε το Express είναι να το εγκαταστήσετε σε μια ήδη αρχικοποιημένη τοπική ανάπτυξη εργασίας κατάλογο με το npm εντολή, για παράδειγμα:

$ npm εγκατάσταση express - αποθήκευση

ο -σώσει Η επιλογή, η οποία είναι στην πραγματικότητα ενεργοποιημένη από προεπιλογή στο NPM 5.0 και νεότερη έκδοση, λέει στον διαχειριστή πακέτων να προσθέσει τη μονάδα Express στη λίστα εξαρτήσεων στο αρχείο package.json μετά την εγκατάσταση.

Ένας άλλος γρήγορος τρόπος για να ξεκινήσετε να χρησιμοποιείτε το Express είναι να εγκαταστήσετε το εκτελέσιμο γεννήτριασαφή (1) παγκοσμίως και, στη συνέχεια, χρησιμοποιήστε το για να δημιουργήσετε την εφαρμογή τοπικά σε έναν νέο φάκελο εργασίας:

$ npm install -g express-generator @ 4

$ express / tmp / foo && cd / tmp / foo

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

Εγκατάσταση $ npm

Έναρξη $ npm

Είναι δύσκολο να διακρίνεις στιγμιότυπα από τα πακέτα εκατομμύρια-plus στο NPM, αλλά ξεχωρίζουν μερικές κατηγορίες. Το Express είναι το παλαιότερο και πιο σημαντικό παράδειγμα των πλαισίων Node.js. Μια άλλη μεγάλη κατηγορία στο αποθετήριο NPM είναι τα βοηθητικά προγράμματα ανάπτυξης JavaScript, συμπεριλαμβανομένου του browserify, ενός πακέτου λειτουργικών μονάδων. bower, ο διαχειριστής πακέτων του προγράμματος περιήγησης. γρύλισμα, ο δρομέας εργασιών JavaScript · και gulp, το σύστημα δημιουργίας ροής. Τέλος, μια σημαντική κατηγορία για τους προγραμματιστές του Node.js είναι οι πελάτες βάσεων δεδομένων, από τους οποίους υπάρχουν περισσότεροι από 8.000, συμπεριλαμβανομένων δημοφιλών ενοτήτων όπως redis, mongoose, firebase και pg, ο πελάτης PostgreSQL.

Συνοψίζοντας, το Node.js είναι ένα περιβάλλον χρόνου εκτέλεσης JavaScript μεταξύ πλατφορμών για διακομιστές και εφαρμογές. Είναι χτισμένο σε έναν βρόχο συμβάντος χωρίς νήμα, τον κινητήρα JavaScript του Google Chrome V8 και ένα API I / O χαμηλού επιπέδου. Διάφορες τεχνικές, συμπεριλαμβανομένης της μονάδας συμπλέγματος, επιτρέπουν στις εφαρμογές Node.js να κλιμακώνονται πέρα ​​από έναν πυρήνα CPU. Πέρα από τη βασική λειτουργικότητά του, το Node.js ενέπνευσε ένα οικοσύστημα με περισσότερα από ένα εκατομμύριο πακέτα που έχουν καταχωριστεί και εκδοθεί στο αποθετήριο NPM και μπορούν να εγκατασταθούν χρησιμοποιώντας τη γραμμή εντολών NPM ή μια εναλλακτική λύση όπως το Νήμα.