npm workspaces în Node.js

Mai multe pachete într-un singur depozit (monorepo), cu un singur node_modules și comenzi rulate în toate deodată.

Sintaxă
"workspaces": ["packages/*"]
npm install <pachet> -w <spațiu>
npm run <script> --workspaces

Ce face npm workspaces

Spațiile de lucru (workspaces) țin mai multe pachete în același depozit: de exemplu un API, un site și o bibliotecă comună. În package.json-ul de la rădăcină, câmpul "workspaces" enumeră directoarele lor (acceptă tipare ca packages/*). Rădăcina are de obicei "private": true, ca să nu fie publicată din greșeală.

Un singur npm install la rădăcină instalează dependențele tuturor pachetelor într-un node_modules comun și pune acolo legături spre fiecare spațiu de lucru. Astfel api poate face import din utilitare ca dintr-un pachet obișnuit, iar modificările se văd imediat.

Opțiunea -w <nume> (--workspace) trimite o comandă unui singur spațiu de lucru, iar --workspaces tuturor. Merge la install, run, test, version, publish și altele.

Parametri

Parametru Descriere
"workspaces" În package.json de la rădăcină: listă de directoare sau tipare.
-w <nume sau director> Comanda rulează în spațiul de lucru dat.
--workspaces, -ws Comanda rulează în toate spațiile de lucru.
--if-present Sare peste spațiile de lucru fără scriptul cerut.

Exemple

Exemplul 1: Monorepo cu două pachete

npm init -w creează pachetul și îl leagă (conținutul fiecărui package.json nou, afișat de npm, a fost scos din ieșire). Apoi instalezi biblioteca comună în API.

# package.json de la rădăcină:
# { "name": "scoala-online", "private": true, "workspaces": ["packages/*"] }
npm init -y -w packages/utilitare
npm init -y -w packages/api
npm install utilitare -w api
npm ls

Ieșire în terminal

added 1 package in 539ms

added 1 package in 255ms

up to date, audited 5 packages in 236ms

found 0 vulnerabilities
scoala-online@ /home/ana/proiecte/scoala-online
├─┬ api@1.0.0 -> ./packages/api
│ └── utilitare@1.0.0 deduped -> ./packages/utilitare
└── utilitare@1.0.0 -> ./packages/utilitare

Exemplul 2: Testele din toate pachetele sau dintr-unul

npm test --workspaces
npm run test -w api

Ieșire în terminal

> api@1.0.0 test
> node -e "console.log('teste api ok')"

teste api ok

> utilitare@1.0.0 test
> node -e "console.log('teste utilitare ok')"

teste utilitare ok

> api@1.0.0 test
> node -e "console.log('teste api ok')"

teste api ok

Greșeli frecvente

  • Rulezi npm install în directorul unui pachet din monorepo: apare un al doilea node_modules și un al doilea lock. Instalează mereu de la rădăcină, cu -w.
  • Uiți "private": true la rădăcină: un npm publish dat din greșeală acolo publică tot depozitul.
  • Dai pachetelor nume care există deja în registru: npm poate alege pachetul public în locul celui local. Folosește un scop, de exemplu @scoala/utilitare.

Comenzi înrudite

  • npm link: Leagă un pachet aflat pe disc de un proiect, prin legături simbolice, ca să-l testezi fără să-l publici.
  • npm run: Rulează un script din câmpul „scripts” al package.json, cu node_modules/.bin în PATH și cu scripturile pre/post.
  • npm init: Creează fișierul package.json al unui proiect nou; cu -y acceptă valorile implicite fără întrebări.
  • pnpm și yarn (comparație cu npm): Comenzile npm și echivalentele lor în pnpm și Yarn, plus ce trebuie să știi despre Corepack în Node.js 25+.
  • package.json: Fișierul de configurare al unui proiect Node.js: nume, versiune, tipul modulelor, scripturi, dependențe și versiunea Node cerută.