Chiunque si sia trovato (per un motivo o per l’altro) a sviluppare una complessa applicazione JavaScript si sarà probabilmente imbattuto in NPM. Che cos’è questo NPM? Semplicemente si tratta del package manager sviluppato per il linguaggio JavaScript (sicuramente non l’unico ma probabilmente il più diffuso), lo strumento tramite il quale organizzare, condividere e ricevere librerie JavaScript sviluppate internamente oppure da altre persone. Ancora più semplicemente potremmo dire che NPM è il corrispettivo di Bower/Composer per il linguaggio PHP o di RubyGems per il linguaggio Ruby.

Utilizzando NPM potremmo consultare e scaricare i package (i pacchetti o i moduli – ormai questi termini sono utilizzati come sinonimi persino dalla guida ufficiale di NPM che potete trovare a questo indirizzo) disponibili all’interno del registro di NPM consultabile all’indirizzo: npmjs.com.

Installazione

L’installazione di NPM differisce a seconda del sistema operativo in uso e della versione prescelta, per questo motivo consiglio di fare riferimento alla documentazione ufficiale. A partire dalle ultime versioni di Node.js (potete leggere di più a proposito di Node.js nell’articolo dedicato) NPM viene installato automaticamente a seguito dell’installazione di Node.js, pertanto potreste già disporre del packet manager sulla vostra macchina, per scoprirlo vi basterà eseguire il seguente comando all’interno del terminale:

nmp -v

Se quest’ultimo restituirà la versione dell’applicativo non dovrete preoccuparvi di eseguire alcuna operazione. Eventualmente potreste verificare la presenza di un aggiornamento eseguendo il comando:

npm install npm@latest -g

Comandi Principali

NPM mette a disposizione una serie di comandi utili alla gestione e all’installazione delle librerie JavaScript, tali comandi possono essere eseguiti all’interno del terminale presente nel nostro sistema (CMD o BASH). Il primo comando che voglio segnalare (il terzo se consideriamo quelli destinati all’installazione e all’aggiornamento di NPM) riguarda l’accesso al manuale del package manager, consultabile in questo modo:

node help <comando>

# oppure
node <comando> -h

In questo modo potremo sempre verificare il proposito di un comando e l’elenco degli eventuali parametri aggiuntivi che accetta. Il compito principale di un packet manager è quello di permettere l’installazione dei moduli. Tali moduli possono essere ricercati sul sito ufficiale oppure direttamente dalla nostra linea di comando.

npm search <package>

Al comando search possono essere allegate numerose opzioni, vi invito consultare la documentazione ufficiale per maggiori informazioni (oppure ad eseguire il sopracitato comando di aiuto). Vediamo di seguito un esempio di chiamata al comando search:

# esempio
npm search json

Risultato ottenuto:

Una volta scelto il package interessato, supponiamo “json”, possiamo procedere con la sua installazione. Utilizzando il comando install, associato all’opzione -g, richiederemo l’installazione globale del pacchetto “json”, tale pacchetto sarà quindi installato all’interno del nostro sistema e richiamabile direttamente da linea di comando.

npm install -g json

Nell’eseguire il comando precedente non abbiamo specificato alcuna versione particolare del package “json”. Questo porterà all’installazione dell’ultima versione disponibile dello stesso, in alternativa possiamo decidere di richiedere l’installazione di una specifica versione:

npm install -g json@versione

Tutte le librerie che andremo ad installare tramite NPM verranno posizionate all’interno di una certa directory del nostro sistema la quale è definita all’interno del nostro file di configurazione. Possiamo prendere visione di tale percorso eseguendo il comando config get in questo modo:

npm config get prefix

# Resituisce:
C:\Users\mark116\AppData\Roaming\npm

Infine, vediamo i principali comandi che possono essere eseguiti sui package a livello globale:

  • list, restituisce la lista dei package disponibili;
  • update, aggiorna il pacchetto passato come argomento;
  • outdated, verifica la presenza di aggiornamenti;
  • unistall, rimuove un pacchetto come argomento.

Nel frammento di codice sottostante sono proposti alcuni esempi pratici:

# Elenco dei package installati globalmente (l'opzione --depth rimuove le eventuali dipendenze)
npm list -g --depth=0

# Aggiorna il pacchetto
npm update -g <pacchetto>

# Verifica la presenza di eventuali aggiornamenti
npm outdated -g --depth=0

# Rimuove il pacchetto
npm uninstall -g <pacchetto>

Installazioni locali – il file package.json

A dispetto di quanto detto finora i package manager come NPM non vengono normalmente utilizzati per gestire le librerie JavaScript installate all’interno di un sistema, bensì per gestire le librerie installate all’interno di un progetto. In particolare, essi si dimostrano estremamente utili nei casi in cui si ha la necessità di mantenere sincronizzate le librerie utilizzate in un progetto sviluppato da un insieme più o memo ampio di persone (che devono quindi disporre delle medesime librerie).

A tale scopo NPM (ma in realtà anche il composer di PHP e molti altri package manager) utilizza un file JSON denominato “package.json” al fine di mantenere aggiornato l’elenco delle librerie installate e le relative versioni. Questo file può essere aggiunto manualmente al progetto, oppure generato mediante il comando init, nello specifico:

npm init

Eseguito il comando precedente ci verranno poste alcune domande utili ad inquadrare il progetto (nome del progetto, descrizione, versione, eccetera), possiamo decidere di ignorarle ed utilizzare i valori di default eseguendo il comando:

npm init -y

In quale porterà alla creazione di un file “package.json” con le seguenti caratteristiche:

{
  "name": "Progetti",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

All’interno di un progetto locale l’inserimento e la rimozione dei package avverranno in modo del tutto simile a quanto definito in precedenza, in questi casi dovremo solo ricordarci di eliminare l’opzione -g (global) dall’esecuzione del comando.

# Elenco dei package installati globalmente (l'opzione --depth rimuove le eventuali dipendenze)
npm list --depth=0

# Aggiorna il pacchetto
npm update <pacchetto>

# Verifica la presenza di eventuali aggiornamenti
npm outdated --depth=0

# Rimuove il pacchetto
npm uninstall <pacchetto>

Condivisione di un progetto

I packet manager come NPM possono essere utilizzati per facilitare la condivisione delle librerie fra i membri di un team di sviluppo. Supponiamo ad esempio di stare utilizzando un software di controllo di versione (come git o mercurial) per mantenere allineato lo sviluppo di un progetto condiviso, in questo caso ci basterà inserire all’interno del repository in file “package.json” ed escludere (mediante file “.gitignore” o “.hgignore”) la cartella “node_modules”.

In questo modo ogni ambiente di sviluppo disporrà della propria libreria di package (la cartella “node_modules”) che verrà mantenuta sincronizzata mediante l’utilizzo dell’apposito comando NPM e grazie alla presenza del file condiviso “package.json”. A seguito di ogni richiesta di pull (e a eseguito del clone iniziale) i diversi sviluppatori dovranno limitarsi ad eseguire il comando:

npm install

Per allineare la propria libreria locale a quella del team di sviluppo.