Cum să Instalezi NVM pentru Node.js pe Ubuntu: Ghid Tehnic Complet
NVM (Node Version Manager) este un script shell conform POSIX care instalează și gestionează mai multe medii de execuție Node.js izolate pe o singură mașină, fără a necesita privilegii de root sau modificarea căilor la nivel de sistem. Fiecare versiune Node.js se află în propriul director sub `~/.nvm/versions/node/`, oferindu-vă o izolare completă, fără conflicte între proiecte.
Acest ghid parcurge o instalare NVM de nivel producție pe Ubuntu (20.04, 22.04 și 24.04), acoperind nu doar comenzile de bază, ci și cazurile speciale ale fișierelor de profil shell, automatizarea fluxului de lucru `.nvmrc`, migrarea pachetelor globale și capcanele specifice serverelor pe care majoritatea tutorialelor le omit.
De ce NVM în loc de managerul de pachete al sistemului
Instalarea Node.js prin `apt` plasează un singur binar la nivel de sistem la `/usr/bin/node`. Actualizarea acestuia afectează simultan toate aplicațiile de pe gazdă. Pe o mașină de dezvoltare partajată sau un VPS care rulează mai multe proiecte Node.js, aceasta creează medii fragile, greu de reprodus.
NVM rezolvă această problemă instalând fiecare versiune Node.js într-un director din spațiul utilizatorului și manipulând `PATH` la nivelul shell-ului. Rezultatul este controlul versiunilor per utilizator, per proiect, fără niciun impact asupra stării pachetelor sistemului de operare.
NVM vs. Alți manageri de versiuni Node.js
| Funcționalitate | NVM | fnm | Volta | n |
|---|
| — | — | — | — | — |
|---|
| Limbaj | Shell (Bash/Zsh) | Rust | Rust | Shell |
|---|
| Viteză | Moderată | Foarte rapidă | Foarte rapidă | Rapidă |
|---|
| Suport `.nvmrc` | Da | Da | Parțial | Nu |
|---|
| Fixare per proiect | Da | Da | Da | Nu |
|---|
| Suport Windows | Nu (doar WSL) | Da | Da | Nu |
|---|
| Izolarea pachetelor globale | Da | Da | Da | Nu |
|---|
| Suprasarcină la pornirea shell-ului | ~70ms | ~5ms | ~5ms | Minimă |
|---|
| Maturitate / ecosistem | Cea mai ridicată | Ridicată | Medie | Ridicată |
|---|
NVM rămâne opțiunea cel mai bine documentată și susținută de ecosistem, făcând-o implicit cea mai sigură alegere pentru echipe și medii de server unde reproductibilitatea contează mai mult decât viteza brută de pornire.
Cerințe preliminare
- Ubuntu 20.04, 22.04 sau 24.04 (desktop sau server)
- Un cont de utilizator non-root cu privilegii `sudo`
- `curl` sau `wget` instalat (ambele sunt prezente implicit pe majoritatea imaginilor Ubuntu)
- Familiarizare de bază cu Bash sau Zsh
Pentru a confirma shell-ul și versiunea Ubuntu înainte de a începe:
“`bash
echo $SHELL
lsb_release -a
“`
Pasul 1: Actualizați indexul de pachete al sistemului
Reîmprospătați listele de pachete APT pentru a vă asigura că orice dependențe rezolvate în timpul sesiunii sunt actuale:
“`bash
sudo apt-get update && sudo apt-get upgrade -y
“`
Confirmați de asemenea că `curl` este disponibil:
“`bash
curl –version || sudo apt-get install -y curl
“`
Pasul 2: Descărcați și rulați scriptul de instalare NVM
Programul de instalare oficial NVM este găzduit pe GitHub. Clonează depozitul NVM în `~/.nvm` și adaugă blocul de inițializare shell necesar în fișierul dvs. de profil.
Opțiunea A — Folosind curl (recomandat):
“`bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
“`
Opțiunea B — Folosind wget:
“`bash
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
“`
Verificați întotdeauna cel mai recent tag de versiune pe pagina de lansări NVM de pe GitHub înainte de a rula. Înlocuiți `v0.40.1` cu tag-ul stabil curent dacă a fost publicată o versiune mai nouă.
Ce face de fapt programul de instalare:
- Clonează depozitul NVM în `~/.nvm`
- Detectează shell-ul activ (`bash`, `zsh`, `ksh` sau `fish`)
- Adaugă următorul bloc de inițializare în fișierul de profil corespunzător (`~/.bashrc`, `~/.zshrc`, `~/.profile` sau `~/.bash_profile`)
“`bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"
“`
Notă de securitate: Redirecționarea unui script de la distanță direct în `bash` este un tipar comun, dar prezintă riscuri inerente. Pentru servere de producție sau medii de server dedicat, descărcați mai întâi scriptul, inspectați-l, apoi executați-l:
“`bash
curl -o install_nvm.sh https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh
cat install_nvm.sh # review before running
bash install_nvm.sh
“`
Pasul 3: Activați NVM în sesiunea curentă de shell
Programul de instalare modifică profilul dvs., dar aceste modificări intră în vigoare doar în sesiunile noi de shell. Pentru a activa NVM imediat fără a deschide un terminal nou:
Pentru Bash:
“`bash
source ~/.bashrc
“`
Pentru Zsh:
“`bash
source ~/.zshrc
“`
Încărcare manuală (funcționează în orice shell):
“`bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
“`
Capcană frecventă: Fișierul de profil nu este încărcat în shell-urile non-interactive
Pe Ubuntu, `~/.bashrc` este încărcat doar pentru shell-urile interactive non-login. Dacă vă conectați prin SSH (un shell de login), Bash citește în schimb `~/.bash_profile` sau `~/.profile`. Dacă NVM nu este găsit după autentificarea SSH, adăugați blocul de încărcare în `~/.bash_profile`:
“`bash
echo 'source ~/.bashrc' >> ~/.bash_profile
source ~/.bash_profile
“`
Aceasta este una dintre cele mai frecvent întâlnite probleme la configurarea NVM pe servere la distanță.
Pasul 4: Verificați instalarea NVM
“`bash
nvm –version
“`
Rezultat așteptat (numărul versiunii poate varia):
“`
0.40.1
“`
Dacă comanda returnează `nvm: command not found`, profilul shell nu a fost încărcat corect. Rulați din nou comanda de încărcare din Pasul 3 și verificați că blocul de inițializare există în fișierul dvs. de profil:
“`bash
grep -n 'NVM_DIR' ~/.bashrc
“`
Pasul 5: Instalați Node.js folosind NVM
Instalați cea mai recentă versiune LTS (recomandat pentru producție)
“`bash
nvm install –lts
“`
Indicatorul `–lts` instalează cea mai recentă versiune Long-Term Support, care primește patch-uri de securitate timp de 30 de luni. Pentru sarcini de producție pe un VPS cu cPanel sau orice mediu de server, LTS este puternic preferat față de versiunea curentă.
Instalați cea mai recentă versiune absolută
“`bash
nvm install node
“`
Instalați o versiune specifică
“`bash
nvm install 20.14.0
“`
Listați toate versiunile disponibile de la distanță
“`bash
nvm ls-remote
“`
Pentru a filtra doar versiunile LTS:
“`bash
nvm ls-remote –lts
“`
Pasul 6: Verificați versiunile active Node.js și npm
“`bash
node -v
npm -v
“`
Confirmați de asemenea calea binarului pentru a vă asigura că nu folosiți accidental o instalare Node.js la nivel de sistem:
“`bash
which node
Expected: /home/<username>/.nvm/versions/node/v20.14.0/bin/node
“`
Pasul 7: Gestionați mai multe versiuni Node.js
Listați toate versiunile instalate local
“`bash
nvm ls
“`
Exemplu de rezultat:
“`
-> v20.14.0
v18.20.3
v16.20.2
default -> lts/* (-> v20.14.0)
node -> stable (-> v20.14.0) (default)
lts/* -> lts/iron (-> v20.14.0)
“`
Comutați între versiuni
“`bash
nvm use 18.20.3
“`
Această modificare se aplică doar sesiunii curente de terminal. Deschiderea unui terminal nou revine la aliasul implicit.
Verificați ce versiune este activă în prezent
“`bash
nvm current
“`
Pasul 8: Setați o versiune Node.js implicită persistentă
Pentru a face o versiune specifică implicită pentru toate sesiunile noi de shell:
“`bash
nvm alias default 20.14.0
“`
Puteți de asemenea crea un alias pentru o linie de lansare în loc de o versiune specifică de patch, care urmărește automat actualizările în cadrul acelei linii:
“`bash
nvm alias default lts/*
“`
Pasul 9: Automatizați comutarea versiunilor cu `.nvmrc`
Aceasta este una dintre cele mai puternice și mai puțin utilizate funcționalități ale NVM. Plasați un fișier `.nvmrc` în rădăcina proiectului dvs. conținând versiunea Node.js necesară:
“`bash
echo "20.14.0" > /path/to/your/project/.nvmrc
“`
Apoi, când intrați cu `cd` în acel director:
“`bash
nvm use
Found '/path/to/your/project/.nvmrc' with version <20.14.0>
Now using node v20.14.0
“`
Comutare automată a versiunii la schimbarea directorului
Adăugați următoarele în `~/.bashrc` (sau `~/.zshrc`) pentru a declanșa `nvm use` automat ori de câte ori intrați într-un director care conține un fișier `.nvmrc`:
Pentru Bash:
“`bash
cdnvm() {
command cd "$@" || return $?
nvm_path="$(nvm_find_up .nvmrc | command tr -d 'n')"
if [[ ! $nvm_path = *[^[:space:]]* ]]; then
declare default_version
default_version="$(nvm version default)"
if [[ $default_version == "N/A" ]]; then
nvm use default
elif [[ $(nvm current) != "$default_version" ]]; then
nvm use default
fi
elif [[ -r "$nvm_path/.nvmrc" && -r "$nvm_path" ]]; then
declare nvm_version
nvm_version=$(<"$nvm_path/.nvmrc")
declare locally_resolved_nvm_version
locally_resolved_nvm_version="$(nvm ls –no-colors "$nvm_version" | command tail -1 | command tr -d '->*' | command tr -d '[:space:]')"
if [[ "$locally_resolved_nvm_version" == "N/A" ]]; then
nvm install "$nvm_version"
elif [[ $(nvm current) != "$locally_resolved_nvm_version" ]]; then
nvm use "$nvm_version"
fi
fi
}
alias cd='cdnvm'
“`
Acest tipar este deosebit de valoros în pipeline-urile CI/CD și în mediile de echipă unde mai mulți dezvoltatori lucrează la proiecte cu cerințe diferite de runtime.
Pasul 10: Gestionați pachetele npm globale între versiuni
Fiecare versiune Node.js instalată de NVM are propriul director `node_modules` izolat pentru pachetele instalate global. Aceasta înseamnă că instrumentele precum `pm2`, `yarn` sau `typescript` instalate global sub `v18` nu sunt disponibile sub `v20`.
Instalați un pachet global pentru versiunea activă
“`bash
npm install -g yarn
npm install -g pm2
npm install -g typescript
“`
Migrați pachetele globale la instalarea unei versiuni noi
NVM oferă un indicator integrat pentru a copia toate pachetele globale dintr-o versiune într-o nouă instalare:
“`bash
nvm install 20.14.0 –reinstall-packages-from=18.20.3
“`
Acest lucru este esențial la actualizarea versiunilor Node.js pe un server care rulează procese persistente gestionate de PM2 sau instrumente similare.
Listați pachetele instalate global pentru versiunea curentă
“`bash
npm list -g –depth=0
“`
Pasul 11: Dezinstalați o versiune Node.js
Înainte de dezinstalare, comutați la o altă versiune decât cea pe care doriți să o eliminați:
“`bash
nvm use 20.14.0
nvm uninstall 16.20.2
“`
Nu puteți dezinstala versiunea activă în prezent. Încercarea de a face acest lucru returnează o eroare.
Avansat: Utilizarea NVM în medii non-interactive (CI/CD, Cron, Systemd)
NVM se bazează pe fișierele de inițializare ale shell-ului care nu sunt încărcate în shell-urile non-interactive. Aceasta cauzează erori `node: command not found` în job-urile cron, fișierele de unitate systemd și unele medii CI.
Soluția 1: Utilizați calea completă a binarului
“`bash
/home/username/.nvm/versions/node/v20.14.0/bin/node /path/to/app.js
“`
Soluția 2: Încărcați NVM explicit în scripturi
“`bash
#!/bin/bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
nvm use 20.14.0
node /path/to/app.js
“`
Soluția 3: Creați un symlink pentru acces la nivel de sistem (utilizați cu precauție)
“`bash
sudo ln -s /home/username/.nvm/versions/node/v20.14.0/bin/node /usr/local/bin/node
“`
Această abordare sacrifică izolarea per utilizator, dar este uneori necesară pentru serviciile systemd care rulează ca utilizator de serviciu dedicat.
NVM pe hosting partajat vs. VPS vs. servere dedicate
| Mediu | Compatibilitate NVM | Note |
|---|
| — | — | — |
|---|
| Hosting partajat | Nesuportat | Fără acces shell; utilizați Node.js furnizat de platformă |
|---|
| [VPS Hosting](https://alexhost.com/vps/) | Excelent | Acces complet la shell; izolarea per utilizator funcționează perfect |
|---|
| [Servere Dedicate](https://alexhost.com/dedicated-servers/) | Excelent | Ideal pentru medii cu mai multe proiecte și runnere CI |
|---|
| Containere Docker | Parțial | Luați în considerare utilizarea imaginilor Docker oficiale Node.js în schimb |
|---|
| Web Hosting Partajat | Nesuportat | Fără acces SSH în majoritatea configurațiilor |
|---|
Pentru echipele care rulează aplicații Node.js alături de alte servicii, un VPS vă oferă controlul la nivel de shell pe care NVM îl necesită, fără suprasarcina gestionării hardware-ului fizic.
Listă de verificare practică cu concluzii cheie
Utilizați aceasta ca referință pentru implementare și configurare:
- Verificați tipul shell-ului (`echo $SHELL`) înainte de instalare — Zsh și Bash necesită fișiere de profil diferite
- Utilizați întotdeauna `–lts` pentru instalările Node.js de producție; rezervați `node` (latest) pentru lucrări experimentale
- Includeți `.nvmrc` în controlul versiunilor astfel încât fiecare membru al echipei și runner CI să folosească versiunea identică de runtime
- Utilizați `–reinstall-packages-from` la actualizarea versiunilor Node.js pentru a evita reinstalarea manuală a instrumentelor globale
- Încărcați NVM explicit în orice script non-interactiv (cron, systemd, pipeline-uri CI) — nu presupuneți niciodată că profilul shell a fost încărcat
- Auditați pachetele globale per versiune cu `npm list -g –depth=0` după comutarea versiunilor pentru a detecta timpuriu dependențele lipsă
- Fixați versiuni exacte în `.nvmrc` (ex. `20.14.0`) mai degrabă decât aliasuri (ex. `lts`) pentru reproductibilitate maximă în producție
- Verificați `which node` după comutarea versiunilor pentru a confirma că nu folosiți accidental un binar instalat la nivel de sistem
Întrebări frecvente
NVM necesită acces sudo sau root pentru a instala Node.js?
Nu. NVM instalează totul sub `~/.nvm` în directorul home al utilizatorului curent. Nu sunt necesare privilegii de root pentru instalarea sau comutarea versiunilor Node.js. Acesta este unul dintre principalele sale avantaje față de managerii de pachete la nivel de sistem.
De ce apare `nvm: command not found` după instalare?
Blocul de inițializare NVM a fost adăugat în profilul dvs. shell, dar profilul nu a fost reîncărcat în sesiunea curentă. Rulați `source ~/.bashrc` (Bash) sau `source ~/.zshrc` (Zsh). Dacă eroarea persistă după deschiderea unui terminal nou, verificați că blocul de inițializare a fost de fapt scris în fișierul corect folosind `grep NVM_DIR ~/.bashrc`.
Pot mai mulți utilizatori de pe același server să aibă versiuni diferite de Node.js prin NVM?
Da. Deoarece NVM instalează în directorul home al fiecărui utilizator (`~/.nvm`), fiecare utilizator menține un set complet independent de versiuni Node.js și pachete globale. Aceasta este arhitectura corectă pentru serverele multi-tenant.
Ce se întâmplă cu pachetele npm instalate global când comut versiunile Node.js cu NVM?
Fiecare versiune Node.js are propriul director de pachete globale izolat. Pachetele instalate global sub o versiune nu sunt vizibile pentru alta. Utilizați `nvm install <new-version> –reinstall-packages-from=<old-version>` pentru a le migra automat.
Este NVM potrivit pentru rularea aplicațiilor Node.js în producție pe un server?
NVM este bine adaptat pentru gestionarea versiunii Node.js utilizate, dar pentru gestionarea proceselor în producție ar trebui să îl combinați cu un manager de procese precum PM2 sau să utilizați fișiere de unitate systemd. Asigurați-vă că acele medii non-interactive încarcă explicit NVM sau referențiază calea completă a binarului, așa cum este descris în secțiunea CI/CD de mai sus.
