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

Εκμάθηση Node.js: Ξεκινήστε με το Node.js

Το Node.js, ένα περιβάλλον χρόνου εκτέλεσης JavaScript πολλαπλών πλατφορμών για διακομιστές και εφαρμογές, προσφέρει πολλά οφέλη. Η χαμηλή χρήση μνήμης, η καλή απόδοση και ένα μεγάλο οικοσύστημα πακέτων, που σήμερα αριθμούν περίπου 475.000, έχουν κάνει το Node.js μια δημοφιλή επιλογή για τη δημιουργία διακομιστών ιστού, REST API, εφαρμογών δικτύου σε πραγματικό χρόνο (π.χ. συνομιλία, παιχνίδια) και ακόμη και εφαρμογές για υπολογιστές πολλαπλών πλατφορμών.

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

Θα εξετάσουμε επίσης την εγκατάσταση πρόσθετων ενοτήτων Node.js και άλλων πακέτων JavaScript χρησιμοποιώντας τον διαχειριστή πακέτων NPM. Και θα χρησιμοποιήσουμε ένα πλαίσιο Node.js, σε αυτήν την περίπτωση Koa, για να δημιουργήσουμε περισσότερους διακομιστές Node.js πλούσια σε χαρακτηριστικά.

Ας αρχίσουμε.

Πώς να εγκαταστήσετε το Node.js και το NPM

Ξεκινήστε κάνοντας περιήγηση στο //nodejs.org:

Ίδρυμα Node.js

Κάντε κλικ στο κουμπί για λήψη του LTS (μακροπρόθεσμη υποστήριξη), εκτός εάν γνωρίζετε ότι χρειάζεστε κάποια νέα δυνατότητα στην τρέχουσα έκδοση. Ο ακριβής τρόπος εμφάνισης του προγράμματος εγκατάστασης που έχετε κατεβάσει μπορεί να διαφέρει μεταξύ των λειτουργικών συστημάτων, αλλά σε Mac μοιάζει με αυτό στην αρχή:

Μόλις ολοκληρωθεί η εγκατάσταση, μοιάζει με αυτό:

Τώρα πρέπει να βεβαιωθείτε ότι και οι δύο Node.js και NPM έχουν εγκατασταθεί σωστά. Ανοίξτε ένα κέλυφος γραμμής εντολών (Terminal σε Mac; Γραμμή εντολών σε Windows) και ελέγξτε τις εγκατεστημένες εκδόσεις και των δύο:

$ node — μετατροπή

v6.11.3

$ npm —μετατροπή

3.10.10

Εάν λάβετε σφάλματα που λένε ότι δεν βρέθηκε το Node.js ή το NPM, δοκιμάστε να επανεκκινήσετε την εφαρμογή κελύφους ή να επανεκκινήσετε τον υπολογιστή σας. Εάν αυτό δεν λειτουργεί, ίσως χρειαστεί να επεξεργαστείτε το $ PATH (Mac και Linux) ή το PATH (Windows) και να επανεκκινήσετε ξανά.

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

Θα χρειαστείτε ένα πρόγραμμα επεξεργασίας κώδικα ή IDE, κατά προτίμηση ένα που υποστηρίζει JavaScript και Node.js όπως Sublime Text, Visual Studio Code, Brackets, Atom ή WebStorm.

Παράδειγμα Node.js: Ένας απλός διακομιστής ιστού

Για να ξεκινήσετε πραγματικά απλά, ας κλέψουμε ένα απλό παράδειγμα από τον ιστότοπο Node.js. Αντιγράψτε τον κώδικα και επικολλήστε τον στον επεξεργαστή κώδικα (χρησιμοποιώ το Visual Studio Code, αλλά οποιοσδήποτε επεξεργαστής που αποθηκεύει απλό κείμενο αρκεί) και, στη συνέχεια, αποθηκεύστε τον ως example.js.

const http = απαιτείται («http»);

const hostname = "127.0.0.1";

θύρα const = 3000;

const server = http.createServer ((req, res) => {

res.statusCode = 200;

res.setHeader («Τύπος περιεχομένου», «κείμενο / απλό»);

res.end («Γεια σας Κόσμος \ n»);

});

server.listen (θύρα, όνομα κεντρικού υπολογιστή, () => {

console.log ("Ο διακομιστής λειτουργεί στο // $ {hostname}: $ {port} /");

});

Ανοίξτε ένα κέλυφος στον κατάλογο όπου αποθηκεύσατε το αρχείο και εκτελέστε το αρχείο από τη γραμμή εντολών σας:

$ node example.js

Ο διακομιστής εκτελείται στις //127.0.0.1:3000/

Στην περίπτωσή μου, χρησιμοποίησα το παράθυρο Terminal στο Visual Studio Code. Θα μπορούσα σχεδόν εύκολα να αλλάξω σε ένα ανεξάρτητο παράθυρο κελύφους.

Τώρα περιηγηθείτε στη διεύθυνση URL που αναφέρεται από τον διακομιστή:

Πατήστε Control-C στο Terminal για να σταματήσετε τον διακομιστή Node.

Πριν συνεχίσουμε, ας διαλύσουμε τον κωδικό.

const http = απαιτείται («http»);

Η γραμμή 1 χρησιμοποιεί απαιτώ, με τον οποίο φορτώνετε τις ενότητες στο Node.js. Η δήλωση φορτώνει τη μονάδα Node.js http, η οποία παρέχει το createServer μέθοδος που ονομάζεται στις γραμμές 6 έως 10 και το ακούω μέθοδος που ονομάζεται στις γραμμές 12 έως 14. Ο χειριστής «λίπους βέλους» => στις γραμμές 6 και 12 είναι συντομογραφία για τη δημιουργία ανώνυμων λειτουργιών Lambda, οι οποίες χρησιμοποιούνται συχνά σε εφαρμογές Node.js.

const server = http.createServer ((req, res) => {

res.statusCode = 200;

res.setHeader («Τύπος περιεχομένου», «κείμενο / απλό»);

res.end («Γεια σας Κόσμος \ n»);

});

ο res επιχείρημα προς createServer () στη γραμμή 6 χρησιμοποιείται για τη δημιουργία της απόκρισης. ο επαν Το όρισμα περιέχει το εισερχόμενο αίτημα HTTP, το οποίο αγνοείται σε αυτόν τον κώδικα. ο εκ νέου αποστολή Η μέθοδος ορίζει τα δεδομένα απόκρισης στο "Hello World \ n" και λέει στον διακομιστή ότι όλα έχουν γίνει με τη δημιουργία της απόκρισης.

server.listen (θύρα, όνομα κεντρικού υπολογιστή, () => {

console.log ("Ο διακομιστής εκτελείται σε // $ {hostname}: $ {port} /");

});

Ο διακομιστής κλείσιμο παράγεται από το server.listen () Η μέθοδος λέει στο διακομιστή να ακούει αιτήματα στον καθορισμένο κεντρικό υπολογιστή (127.0.0.1, π.χ. localhost) και θύρα (3000). Το κλείσιμο που παράγεται από το createServer () Η μέθοδος χειρίζεται τα αιτήματα όταν εισέρχονται στον καθορισμένο κεντρικό υπολογιστή και τη θύρα.

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

Παράδειγμα Node.js: Ένας διακομιστής ιστού πολλαπλών διαδικασιών

Εκτός από την εκτύπωση μόνο "Hello World", το παραπάνω παράδειγμα εκτελείται μόνο σε ένα νήμα, που σημαίνει ότι μπορεί να χρησιμοποιήσει μόνο έναν πυρήνα του κεντρικού υπολογιστή. Υπάρχουν φορές που θα έχετε πολλούς πυρήνες που θα θέλατε να αφιερώσετε σε έναν διακομιστή.

Το επίσημο παράδειγμα για τη μονάδα συμπλέγματος Node δείχνει πώς να το διορθώσετε. Όπως και πριν, θα κλέψουμε τον κώδικα και θα τον τρέξουμε. Περιηγηθείτε στην τεκμηρίωση του συμπλέγματος Node.js, αντιγράψτε τον κώδικα, επικολλήστε τον στον επεξεργαστή κώδικα ή στο IDE και αποθηκεύστε τον ως server.js.

const cluster = απαιτείται («σύμπλεγμα»);

const http = απαιτείται («http»);

const numCPUs = απαιτείται ('os'). cpus (). μήκος;

εάν (cluster.isMaster) {

console.log (Το "Master $ {process.pid} εκτελείται");

// Εργάτες πιρούνι.

για (leti = 0; i

cluster.fork ();

}

cluster.on («έξοδος», (εργαζόμενος, κωδικός, σήμα) => {

console.log ("worker $ {worker.process.pid} πέθανε");

});

} αλλιώς {

// Οι εργαζόμενοι μπορούν να μοιραστούν οποιαδήποτε σύνδεση TCP

// Σε αυτήν την περίπτωση είναι ένας διακομιστής HTTP

http.createServer ((req, res) => {

res.writeHead (200);

res.end (`Γεια σου κόσμος από $ {process.pid} \ n`);

Ακούστε (8000).

console.log ("Worker $ {process.pid} ξεκίνησε");

}

Όταν εκτελείτε κόμβος server.js από τη γραμμή εντολών σας, το αρχείο καταγραφής θα εμφανίσει τα αναγνωριστικά διεργασίας για τις διαδικασίες κύριου και εργαζομένου. Θα πρέπει να υπάρχουν τόσοι εργαζόμενοι όσο ο υπολογιστής σας έχει λογικούς πυρήνες - οκτώ για το MacBook Pro με τον επεξεργαστή Core i7, ο οποίος διαθέτει τέσσερις πυρήνες υλικού και υπερ-σπείρωμα.

Εάν κάνετε περιήγηση στο localhost: 8000 ή στο 127.0.0.1:8000, θα εμφανιστεί η ένδειξη "Γεια σας κόσμος". Μπορείτε να πατήσετε Control-C στο παράθυρο τερματικού για να σταματήσετε τις διαδικασίες του διακομιστή κόμβων.

const cluster = απαιτείται («σύμπλεγμα»);

const http = απαιτείται («http»);

const numCPUs = απαιτείται ('os'). cpus (). μήκος;

Οι γραμμές 1 και 2 πρέπει να φαίνονται οικείες από το τελευταίο παράδειγμα. Η γραμμή 3 είναι λίγο διαφορετική. Αντί να απαιτείται απλώς το ΟΣ ενότητα, καλεί επίσης το cpus () συνάρτηση μέλους και επιστρέφει το μήκος του πίνακα που επιστρέφεται, που είναι ο αριθμός των CPU. Ο ίδιος ο πίνακας και το ΟΣ Στη συνέχεια, ο σύνδεσμος λειτουργικής μονάδας δεν είναι προσβάσιμος και ενδέχεται να συλλέγονται σκουπίδια από τη μηχανή JavaScript αργότερα.

εάν (cluster.isMaster) {

console.log (Το "Master $ {process.pid} εκτελείται");

// Εργάτες πιρούνι.

για (let i = 0; i <num CPUs; i ++) {

cluster.fork ();

   }

cluster.on («έξοδος», (εργαζόμενος, κωδικός, σήμα) => {

console.log ("worker $ {worker.process.pid} πέθανε");

   });

}

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

} αλλιώς {

// Οι εργαζόμενοι μπορούν να μοιράζονται οποιαδήποτε σύνδεση TCP

// Σε αυτήν την περίπτωση είναι ένας διακομιστής HTTP

http.createServer ((req, res) => {

res.writeHead (200);

res.end («γειά σου κόσμος \ n»);

Ακούστε (8000).

console.log ("Worker $ {process.pid} ξεκίνησε");

Το μπλοκ που ξεκινά από τη γραμμή 16 εκτελείται μόνο από διαδικασίες εργαζομένων. Αυτός ο κωδικός θα πρέπει να φαίνεται οικείος από το προηγούμενο παράδειγμα: Δημιουργεί έναν διακομιστή ιστού που ανταποκρίνεται σε οποιοδήποτε αίτημα με το "γεια σας κόσμο".

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

Η τεκμηρίωση λέει ότι η μονάδα συμπλέγματος Node.js χρησιμοποιεί έναν τροποποιημένο αλγόριθμο round-robin από προεπιλογή, εκτός από τα Windows. Ο αλγόριθμος ελέγχεται από το cluster.schedulingΠολιτική ιδιοκτησία.

Πώς ξέρουμε ότι αυτό λειτουργεί; Ας το δοκιμάσουμε. Θα χρειαστεί να αλλάξετε μόνο μια γραμμή κώδικα. Επεξεργασία γραμμής 21 για ανάγνωση:

      res.end (`Γεια σου κόσμος από $ {process.pid} \ n`);

Παρατηρήστε ότι δεν πρέπει μόνο να προσθέσετε από $ {process.pid}, αλλά πρέπει επίσης να αλλάξετε τους οριοθέτες από μεμονωμένα εισαγωγικά σε back ticks, έτσι ώστε το JavaScript να εκτελεί μεταβλητή αντικατάσταση στη συμβολοσειρά.

Αποθηκεύστε το αρχείο, σταματήστε οποιαδήποτε προηγούμενη παρουσία και εκτελέστε το ξανά. Ίσως πιστεύετε ότι κάθε φορά που ανανεώνετε τον πελάτη του προγράμματος περιήγησής σας, το αναγνωριστικό διαδικασίας που επιστρέφεται θα αλλάζει, αλλά θα έχετε λάθος. Το πρόγραμμα περιήγησης είναι πολύ έξυπνο και δεν έχουμε επισημάνει την ιστοσελίδα ως λήξη, επομένως το πρόγραμμα περιήγησης θα αποθηκεύσει προσωρινά την απόκριση την πρώτη φορά που θα εκτελεστεί και θα συνεχίσει να εμφανίζει τον ίδιο αριθμό. Αυτό θα το κάνει ακόμα και αν δημιουργήσετε πολλές καρτέλες προγράμματος περιήγησης ή σελίδες που οδηγούν στην ίδια διεύθυνση URL. Ωστόσο, μπορείτε να δείτε ότι η αποστολή Round-Robin από τον κύριο λειτουργεί με ταυτόχρονη εκτέλεση πολλαπλών προγραμμάτων περιήγησης, στην περίπτωση αυτή Chrome, Safari και Opera:

Εάν είστε εξοικειωμένοι με άλλους διακομιστές ιστού, ενδέχεται να περιμένετε να δείτε ένα σχήμα για τη δρομολόγηση αιτημάτων και τη διατήρηση μόνιμης κατάστασης για τη διατήρηση της σύνδεσης και του περιβάλλοντος κάθε χρήστη στον κόμβο. Δυστυχώς, ο κόμβος δεν διαθέτει αυτό το ενσωματωμένο. Μην φοβάστε: Υπάρχουν πολλά διαδικτυακά πλαίσια πάνω από το Node.js που κάνουν ό, τι θα περιμένατε.

Τρόπος εγκατάστασης μιας μονάδας Node.js με NPM

Για να χρησιμοποιήσετε τις περισσότερες λειτουργικές μονάδες Node, βασικά απλώς εγκαθιστάτε τη λειτουργική μονάδα από το μητρώο NPM, είτε παγκοσμίως είτε σε έναν κατάλογο έργου και, στη συνέχεια, απαιτώ() από τον κωδικό σας. Συχνά ένα έργο εξαρτάται από πολλές μονάδες NPM και διατηρεί αυτήν τη λίστα στο αρχείο project.json. Αντί να εγκαταστήσετε κάθε εξάρτηση από τη γραμμή εντολών, μπορείτε να τα εγκαταστήσετε όλα ταυτόχρονα, συχνά αφού ελέγξετε το έργο από το αποθετήριο του GitHub:

$

$ cd my_project

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

Δεν λειτουργεί κάθε πακέτο NPM με αυτόν τον τρόπο. Ορισμένες, συμπεριλαμβανομένης της React, έχουν "εργοστασιακές" εφαρμογές δημιουργώ εφαρμογές εκκίνησης ως μία από τις επιλογές εγκατάστασής τους.

$ npm install -g create-react-app

$ cd ~ / εργασία

$ create-react-app my-app

$ cd my-app /

Έναρξη $ npm

Δεν είναι ασυνήθιστο να εγκαθίστανται εργαλεία σε παγκόσμιο επίπεδο. Για παράδειγμα, το εργαλείο γωνιακής γραμμής εντολών Ng εγκαθίσταται παγκοσμίως. Τότε το τρέχετε τοπικά για να δημιουργήσετε μια εφαρμογή σε ένα φάκελο.

$ npm install -g @ angular / cli

$ cd ~ / εργασία

$ ng νέα εφαρμογή μου

Το Angular τυχαίνει να έχει μια άλλη μέθοδο εγκατάστασης που μοιάζει περισσότερο με το πρότυπο μοτίβο. Αυτό είναι για τον γωνιακό σπόρο QuickStart:

$ git clone //github.com/angular/quickstart.git γρήγορη εκκίνηση

$ cd γρήγορη εκκίνηση

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

Το αρχείο package.json στον φάκελο γρήγορης εκκίνησης λέει εγκατάσταση npm για τη λήψη σχεδόν της ίδιας λίστας εξαρτήσεων με την εγκατάσταση CLI.

Παράδειγμα Node.js: Ένας διακομιστής web Koa

Ενώ και το React και το Angular αποτελούν μέρος του οικοσυστήματος Node.js και χρειάζονται Node.js και NPM για ανάπτυξη, δεν είναι συγκεκριμένα πλαίσια Node.js - μπορούν να εκτελεστούν σε πρόγραμμα περιήγησης. Καλύπτησα δεκάδες πραγματικά Node.js πλαίσια στον «Πλήρες οδηγό για τα Node.js frameworks».

Για παράδειγμα, το Express είναι ο αρχικός διακομιστής ιστού Node, που διαχειρίζεται την εφαρμογή ιστού, αιτήσεις και απαντήσεις HTTP, δρομολόγηση και μεσαίο λογισμικό. Μια νεότερη επιλογή, η Koa, χρησιμοποιεί γεννήτριες αντί για επιστροφές για μεσαίο λογισμικό.

Εγκαθιστάτε το Koa με το τυπικό μοτίβο μέσα στο φάκελο της εφαρμογής σας:

$ npm εγκατάσταση koa

Παρακάτω είναι ο κωδικός για την εφαρμογή Koa "Hello World", τον οποίο μπορείτε να αποθηκεύσετε και να εκτελέσετε όπως στα προηγούμενα παραδείγματα.

const Koa = απαιτείται («koa»);

const app = νέο Koa ();

// Χ-χρόνος απόκρισης

app.use (async (ctx, next) => {

const start = Date.now ();

περιμένετε επόμενο ();

const ms = Date.now () -start;

ctx.set («Χ-Χρόνος απόκρισης», «$ {ms} ms»);

});

// καταγραφέας

app.use (async (ctx, next) => {

const start = Date.now ();

περιμένετε επόμενο ();

const ms = Date.now () -start;

console.log ("$ {ctx.method} $ {ctx.url} - $ {ms}");

});

// απάντηση

app.use (async ctx => {)

ctx.body = ‘Γεια σας Κόσμος’;

});

app.listen (3000);

Υπάρχει μια διαφορά μεταξύ των γεννητριών μεσαίου λογισμικού όπως χρησιμοποιείται από την Koa και των επιστροφών κλήσεων όπως χρησιμοποιείται από το Express και άλλα πλαίσια Node.js. Πολλές εφαρμογές επανάκλησης απλώς περνούν τον έλεγχο μέσω σειράς συναρτήσεων έως ότου επιστρέψει κάποιος, ενώ ο Koa αποδίδει «downstream» και έπειτα ο έλεγχος ρέει πίσω «upstream».

Στο παραπάνω παράδειγμα, ο χρόνος απόκρισης x «τυλίγει» τη γεννήτρια απόκρισης, με τοπερίμενε το επόμενο () δήλωση που σηματοδοτεί την κλήση. Η χρήση αυτής της ασύγχρονης λειτουργίας είναι πιο ευέλικτη από τις ρητές λειτουργίες, καθώς διευκολύνει την εισαγωγή μιας άλλης γεννήτριας στην ακολουθία, για παράδειγμα ένας καταγραφέας ιστού μεταξύ του χρονοδιακόπτη και της απόκρισης.

Μπορεί να συναντήσετε παλαιότερο κώδικα Koa που χρησιμοποιεί απόδοση μετά αντί περίμενε το επόμενο (). Η διαφορά είναι ότι το Koa υποστηρίζει πλέον τις λειτουργίες ES2015 και async. Η ροή ελέγχου αντιστοιχεί στο ίδιο πράγμα: Μετακινείται στον επόμενο χειριστή στην αλυσίδα στο απόδοση μετά κλήση και μετά επιστρέφει όταν τελειώσουν όλοι οι χειριστές.

$config[zx-auto] not found$config[zx-overlay] not found