Το npm είναι ο διαχειριστής πακέτων του Node.js. Ξεκίνησε το 2009 ως ανοικτού κώδικα project με στόχο να βοηθήσει τους JavaScript developers να μοιράζονται έτοιμα, πακεταρισμένα modules κώδικα για Node.js. Σε αυτό το άρθρο κάνουμε μια σύντομη εισαγωγή για αρχάριους στο npm και το Node.js
Για να ξέρει τα packages και τις εκάστοτε εκδόσεις τους, το npm μιλά εξορισμού με ένα website, που λέγεται Registry το οποίο περιλαμβάνει όλα τα πακέτα ανοικτού κώδικα για το Node.js. Εκεί υπάρχουν χιλιάδες πακέτα και modules για διάφορες χρήσεις, από ανάπτυξη front-end web εφαρμογών (π.χ. Ember), και mobile εφαρμογών (π.χ. Apache Cordova), μέχρι πλατφόρμες ρομποτικής (π.χ. Tessel 2), routers, και γενικά ότι μπορεί να χρειαστείς δουλεύοντας με JS. Το ωραίο είναι οποιοσδήποτε μπορεί να ανεβάσει ένα πακέτο στο npm registry.
Ιδιαίτερα δημοφιλές είναι το πακέτο react, που εγκαθιστά την React, μια πολύ καλή JS βιβλιοθήκη για εύκολη δημιουργία αλληλεπιδραστικών User Interfaces. Στη σελίδα του npmjs project μπορείτε να δείτε τα πακέτα που χρησιμοποιούνται πιο συχνά στα διάφορα projects ενώ υπάρχει και ένα github project, το οποίο καθημερινά δημοσιεύει τα 1000 πιο δημοφιλή πακέτα του npm.
Εγκατάσταση του npm
Το npm υπάρχει στα αποθετήρια των περισσότερων διανομών Linux. Στο Ubuntu/Debian αρκεί να δώσεις την εντολή:
sudo apt install npm
για να εγκατασταθεί η Node.js (v8.10.0 στο Ubuntu bionic) και το npm.
Σημείωση: Επειδή όμως η έκδοση της Node.js που υπάρχει στα αποθετήρια των διανομών είναι συνήθως παλιότερη από την τρέχουσα, είναι καλύτερο να προσθέσουμε και να χρησιμοποιήσουμε τα αποθετήρια της NodeSource, που προσφέρουν την πιο πρόσφατη έκδοση Node.js για Ubuntu, Debian, Red Hat Enterprise Linux, Fedora, CentOS, Linux Mint.
Για παράδειγμα για να εγκαταστήσουμε το Node.js v11.x στο Debian αρκεί να προσθέσουμε το nodesource repository ως root:
curl -sL https://deb.nodesource.com/setup_11.x | bash -
και μετά
apt-get install -y nodejs
Αφού εγκαταστήσαμε το npm στον υπολογιστή μας, τώρα μπορούμε να εγκαταστήσουμε πακέτα για να δουλέψουμε με αυτά ή να πακετάρουμε ένα δικό μας JS project και να το δημοσιεύσουμε στο Registry.
Εγκατάσταση πακέτων
H εγκατάσταση Node.js πακέτων και modules γίνεται με την εντολή npm install ή npm i. Για παράδειγμα η παρακάτω εντολή κατεβάζει από το Registry και εγκαθιστά το πακέτο create-react-app με το οποίο φτιάχνεις απλές react εφαργμογές:
npm i -g create-react-app
Με την παράμετρο -g εγκαθιστούμε το συγκεκριμένο package “globally”, που σημαίνει ότι θα μπορούμε να χρησιμοποιήσουμε τον κώδικα του ως ένα συνηθισμένο εργαλείο στον υπολογιστή μας. Στο παράδειγμά μας, δηλαδή, μπορούμε μετά την εγκατάσταση να τρέξουμε την εντολή:
create-react-app myapp
Σημείωση: Στο Ubuntu πρέπει προφανώς να τρέξεις την παραπάνω εντολή με sudo, διαφορετικά δεν γίνεται globally η εγκατάσταση. Αν αυτό αποτελεί πρόβλημα ασφάλειας, μπορείτε να τρέξετε με τις παρακάτω εντολές ένα σκριπτάκι που αφαιρεί όλα τα global πακέτα, και τα εγκαθιστά ξανά αλλά αυτή τη φορά μέσα σε ένα φάκελο ο οποίος χρησιμοποιείται στη συνέχεια από το npm σε κάθε μελλοντική global εγκατάσταση πακέτου:
cd && wget https://raw.githubusercontent.com/glenpike/npm-g_nosudo/master/npm-g-nosudo.sh chmod +x npm-g-nosudo.sh ./npm-g-nosudo.sh
Πάντως, αν δεν βάζαμε την παράμετρο -g, τότε το npm θα εγκαθιστούσε το πακέτο locally, που σημαίνει ότι θα μπορούσαμε να το χρησιμοποιήσουμε μόνο ως μέρος ενός project και όχι γενικά στον υπολογιστή μας. Ετσι, με την εντολή:
npm install <package_name>
εγκαθιστούμε το unscoped πακέτο “package_name” στον τρέχοντα κατάλογο όπου βρισκόμαστε. Για την ακρίβεια, το npm θα δημιουργήσει τον υποκατάλογο node_modules όπου θα βάλει το “package_name”.
Δείτε βίντεο:
Scoped vs unscoped πακέτα
Με τις τελευταίες εντολές ζητήσαμε να εγκαταστήσουμε unscoped πακέτα. Τι σημαίνει αυτό; Τα πακέτα στο npm ταξινομούνται σε scoped και unscoped. Τα πρώτα είναι πακέτα που μπορεί να έχουν το ίδιο όνομα με ένα πακέτο που έχει φτιάξει άλλος χρήστης του npm. Ξεχωρίζουν όμως μεταξύ τους χάρη στο scope name, το οποίο είναι συνήθως το username με το οποίο ο προγραμματιστής έχει κάνει εγγραφή στο npmjs.org με ένα @ μπροστά. Δηλαδή με την παρακάτω εντολή εγκαθιστούμε το πακέτο packagename του χρήστη user:
npm install @user/packagename
Από την άλλη πλευρά, τα unscoped packages είναι πάντα δημόσια και εγκαθίστανται όπως είδαμε προηγουμένως με npm install αλλά χωρίς @scope μπροστά στο όνομα του πακέτου, δηλαδή: npm install packagename
π.χ. :
npm i create-react-app
Σε τι διαφέρουν τα packages και τα modules
Όπως είπαμε το npm registry περιέχει packages και modules Node.js κώδικα που εγκαθιστούμε με την εντολή npm i. Η διαφορά ανάμεσα στα πακέτα και τα modules είναι ότι τα πρώτα περιέχουν υποχρεωτικά κι ένα αρχείο ρύθμισης που λέγεται package.json ενώ στα modules αυτό δεν είναι υποχρεωτικό. Σε κάθε περίπτωση όμως, για να ανεβάσετε και μοιραστείτε ένα πακέτο ή Node.js module στο npm registry, χρειάζεται να έχετε ένα package.json στο project σας.
Όπως είπαμε, κάθε npm πακέτο περιγράφεται με ένα αρχείο package.json, το οποίο είναι υποχρεωτικό αν θέλετε κάποτε να δημοσιεύσετε το πακέτο στο npm registry. Μέσα σε αυτό το αρχείο ορίζουμε τουλάχιστον δύο πράγματα: το όνομα του πακέτου και την έκδοσή του.
{ "name": "my-awesome-package", "version": "1.0.0" }
Επίσης το package.json μπορεί να ορίζει ποιος είναι ο δημιουργός στο πεδίο author, μια συντομη περιγραφή του έργου, την άδεια χρήσης, την ιστοσελίδα, το repository και άλλα.
Για να φτιάξουμε ένα package.json για το project μας δίνουμε την παρακάτω εντολή μέσα στον φάκελο του project:
npm init
και απαντάμε στις ερωτήσεις. Σημείωση: Με την παραπάνω εντολή θα φτιάξουμε unscoped πακέτο.
Το package.json είναι σημαντικό και για έναν ακόμα λόγο. Γιατί εκεί ορίζουμε αν θέλουμε τις εξαρτήσεις του πακέτου μας από άλλα πακέτα καθώς και τις εκδόσεις εκείνων των πακέτων που απαιτούνται να εγκατασταθούν μαζί με το πακέτο μας.
Για παράδειγμα η εντολή npm install <package_name> εγκαθιστά πάντα την νεότερη έκδοση του εκάστοτε πακέτου. Για να ζητήσουμε συγκεκριμένη ή μίνιμουμ έκδοση για το project μας, μπορούμε να ορίσουμε στο package.json τα πακέτα από τα οποία εξαρτάται το project μας μαζί με τις εκδόσεις που θέλουμε χάρη στο semantic versioning spec, που είναι μια τριάδα αριθμών της μορφής x.x.x, π.χ 1.0.1. Για παράδειγμα, με την παρακάτω ρύθμιση ζητάμε το my_dep με μίνιμουμ έκδοση 1.0.0 αλλά πάντα στη σειρά 1.x και το another_dep με μίνιμουμ έκδοση 2.2.0 αλλά την ίδια minor σειρά:
"dependencies": { "my_dep": "^1.0.0", "another_dep": "~2.2.0" },
Δηλαδή το npm μπορεί να εγκαταστήσει το my_dep μέχρι έκδοση 1.9.9 και το another_dep μέχρι έκδοση 2.2.9.
Δείτε βίντεο:
Σχετικά με τα modules
Όπως είπαμε τα modules είναι κομμάτια Node.js κώδικα που δεν περιέχουν υποχρεωτικά package.json. Στην πράξη, δηλαδή, τα modules είναι οποιοδήποτε αρχείο ή φάκελος μέσα στο node_modules κατάλογό μας το οποίο μπορούμε να φορτώσουμε με την συνάρτηση require() της Node.js. Για να τρέξει σωστά η require() απαιτεί ένα mοdule να είναι ένα από τα εξής:
- είτε ένα αρχείο JS
- είτε ένας φάκελος με ένα index.js αρχείο μέσα
- είτε ένα φάκελος με ένα αρχείο package.json το οποίο περιέχει πεδίο main.
Τέλος, αφού δεν είναι υποχρεωτικό για τα modules να περιέχουν αρχείο package.json, συνεπάγεται ότι δεν είναι όλα τα Node.js modules πακέτα. Αλλά τα modules που περιέχουν ένα package.json, είναι κι αυτά πακέτα.
Σε κάθε περίπτωση, μέσα στο πρόγραμμα μας μπορούμε να φορτώσουμε ένα module (που υπάρχει στο node_modules υποκατάλογο) με την εντολή:
var req = require('module_name')
Πως φτιάχνουμε ένα Node.js module για ανέβασμα στο registry
Για να μοιραστούμε ένα δικό μας module στο npm registry πρέπει να υπάρχει στο φάκελο του ένα package.json (ώστε να είναι πακέτο) και φυσικά το αρχείο που θα φορτώνεται όταν το module “καλείται” από κάποια άλλη εφαρμογή. Όπως είδαμε για να φτιάξουμε unscoped package, δίνουμε την εντολή:
npm init
Για scoped package, και αφού έχουμε δημιουργήσει λογαριασμό στο npm, δίνουμε την εντολή:
npm init --scope=@scope-name
Και στις δύο περιπτώσεις, το npm θα μας θέσει μερικές ερωτήσει. Σε κάθε περίπτωση θα πρέπει κατ’ελάχιστον να συμπληρώσουμε τις ερωτήσεις για το όνομα και την έκδοση του πακέτου (name,version) καθώς και για το πεδίο main, όπου πρέπει να βάλουμε το όνομα του αρχείου που θέλουμε να φορτώνει το module όταν καλείται από άλλες εφαρμογές ή modules. Εξορισμού, το αρχείο ονομάζεται index.js
Αφού έχουμε πλέον το package.json, μπορούμε πλέον να γράψουμε τον κώδικα του module μας μέσα στο index.js. Μέσα στο αρχείο αυτό βάζουμε μια συνάρτηση ως ιδιότητα του αντικειμένου exports, πράγμα που κάνει τη συνάρτηση αυτή δημόσια διαθέσιμη. Για παράδειγμα, για να τυπώσουμε ένα μήνυμα στην κονσόλα:
exports.printMsg = function() { console.log("This is a message from my package"); }
Αφού έχουμε ετοιμάσει τον υπέροχο Node.js κώδικά μας, μπορούμε να δημοσιεύσουμε το πακέτο στο npm registry:
npm publish
ή αν ειναι scoped:
npm publish --access public
Τώρα, οποιοσδήποτε μπορεί να κατεβάσει με npm install το module/πακέτο μας, και να το κάνει require στην js του...
Δείτε βίντεο:
Δείτε περισσότερα
Λήψη πρόσφατης έκδοσης Node.js
Δημιουργία και δημοσίευση scoped πακέτων
- Συνδεθείτε ή εγγραφείτε για να σχολιάσετε