Acest articol ar trebui să servească drept ghid esențial all-in-one pentru colegul favorit al lui Node.js: npm.

Node.js a luat lumea din asalt din 2009. Sute de mii de sisteme au fost construite folosind Node.js, determinând comunitatea dezvoltatorilor să susțină că „JavaScript consumă software”.

Unul dintre factorii majori ai succesului Node este npm – popularul său manager de pachete, care permite dezvoltatorilor JavaScript să partajeze pachete utile, cum ar fi lodash și moment repede și ușor.

În momentul în care scriu acest post, npm a facilitat publicarea a peste 1,3 milioane de pachete cu o rată de descărcare săptămânală de peste 16 miliarde! Aceste numere sunt fantastice pentru orice instrument software. Deci, acum să vorbim despre ce este exact npm.

Ce este NPM?

NPM – sau „Node Package Manager” – este managerul de pachete implicit pentru runtime JavaScript Node.js.

Este, de asemenea, cunoscut sub numele de “Ninja Pumpkin Mutants”, “Nonprofit Pizza Makers” și o serie de alte nume aleatorii pe care le puteți explora și, probabil, contribui la npm-expansiuni.

NPM constă din două părți principale:

  • un instrument CLI (interfață de linie de comandă) pentru publicarea și descărcarea pachetelor și
  • un depozit online care găzduiește pachete JavaScript

Pentru o explicație mai vizuală, ne putem gândi la depozit npmjs.com ca centru de îndeplinire care primește pachete de bunuri de la vânzători (autorii pachetelor npm) și distribuie aceste bunuri cumpărătorilor (utilizatorii pachetelor npm).

Pentru a facilita acest proces, npmjs.com Centrul de împlinire folosește o armată de wombats muncitori (npm CLI) care vor fi repartizați ca asistenți personali fiecărei persoane npmjs.com client. Deci, dependențele sunt livrate dezvoltatorilor JavaScript astfel:

Ce este npm Un tutorial Node Package Manager pentru incepatori

iar procesul de publicare a unui pachet pentru colegii tăi JS ar fi cam așa:

1611595507 411 Ce este npm Un tutorial Node Package Manager pentru incepatori

Să vedem cum această armată de wombats îi ajută pe dezvoltatorii care doresc să folosească pachete JavaScript în proiectele lor. Vom vedea, de asemenea, modul în care îi ajută pe vrăjitorii open-source să-și scoată bibliotecile interesante în lume.

pachet.json

Fiecare proiect din JavaScript – indiferent dacă este Node.js sau o aplicație de browser – poate fi cuprins ca un pachet npm cu propriile informații despre pachet și package.json job pentru a descrie proiectul.

Ne putem gândi package.json ca etichete ștampilate pe acele cutii bune npm pe care armata noastră de Wombats le livrează în jur.

package.json va fi generat când npm init este rulat pentru a inițializa un proiect JavaScript / Node.js, cu aceste metadate de bază furnizate de dezvoltatori:

  • name: numele bibliotecii / proiectului dvs. JavaScript
  • version: versiunea proiectului dvs. De multe ori, pentru dezvoltarea aplicațiilor, acest câmp este adesea neglijat, deoarece nu există nicio nevoie aparentă de versionare a balanțelor open source. Dar totuși, poate fi util ca o sursă a versiunii de implementare.
  • description: descrierea proiectului
  • license: licența proiectului

scripturi npm

package.json acceptă, de asemenea, un scripts proprietate care poate fi definită pentru a rula instrumente din linia de comandă care sunt instalate în contextul local al proiectului. De exemplu, scripts porțiunea unui proiect npm poate arăta cam așa:

{
  "scripts": {
    "build": "tsc",
    "format": "prettier --write **/*.ts",
    "format-check": "prettier --check **/*.ts",
    "lint": "eslint src/**/*.ts",
    "pack": "ncc build",
    "test": "jest",
    "all": "npm run build && npm run format && npm run lint && npm run pack && npm test"
  }
}

cu eslint, prettier, ncc, jest nu neapărat instalat ca executabile globale, ci mai degrabă ca local pentru proiectul dvs. din interior node_modules/.bin/.

Introducerea recentă a npx ne permite să le rulăm node_modules comenzi în domeniul proiectului la fel ca un program instalat la nivel global prin prefixare npx ... (adică npx prettier --write **/*.ts).

dependențe vs devDependențe

Aceste două vin sub formă de obiecte valoare-cheie cu numele bibliotecilor npm ca cheie și ale lor semantic-formatat versiuni ca valoare. Acesta este un exemplu din Șablonul de acțiune TypeScript al lui Github:

{
  "dependencies": {
    "@actions/core": "^1.2.3",
    "@actions/github": "^2.1.1"
  },
  "devDependencies": {
    "@types/jest": "^25.1.4",
    "@types/node": "^13.9.0",
    "@typescript-eslint/parser": "^2.22.0",
    "@zeit/ncc": "^0.21.1",
    "eslint": "^6.8.0",
    "eslint-plugin-github": "^3.4.1",
    "eslint-plugin-jest": "^23.8.2",
    "jest": "^25.1.0",
    "jest-circus": "^25.1.0",
    "js-yaml": "^3.13.1",
    "prettier": "^1.19.1",
    "ts-jest": "^25.2.1",
    "typescript": "^3.8.3"
  }
}

Aceste dependențe sunt instalate prin intermediul npm install comanda cu --save și --save-dev steaguri. Acestea sunt menite să fie utilizate pentru producție și, respectiv, pentru dezvoltarea / mediile de testare. Vom aprofunda în instalarea acestor pachete în secțiunea următoare.

Între timp, este important să înțelegeți posibilele semne care vin înainte de versiunile semantice (presupunând că ați citit mai departe major.minor.patch model de semver):

  • ^: ultima versiune minoră. De exemplu, a ^1.0.4 specificația ar putea instala versiunea 1.3.0 dacă aceasta este cea mai recentă versiune minoră din 1 serii majore.
  • ~: ultima versiune de patch-uri. La fel ca ^ pentru lansări minore, ~1.0.4 specificația ar putea instala versiunea 1.0.7 dacă aceasta este cea mai recentă versiune minoră din 1.0 serie minoră.

Toate aceste versiuni de pachete exacte vor fi documentate într-un document generat package-lock.json fişier.

package-lock.json

Acest fișier descrie versiunile exacte ale dependențelor utilizate într-un proiect JavaScript npm. Dacă package.json este o etichetă descriptivă generică, package-lock.json este un tabel cu ingrediente.

Și la fel cum nu citim de obicei tabelul cu ingrediente al unui produs (cu excepția cazului în care sunteți prea plictisit sau trebuie să știți), package-lock.json nu este menit să fie citit rând cu rând de către dezvoltatori (cu excepția cazului în care suntem disperați să rezolvăm problemele „funcționează în mașina mea”).

package-lock.json este de obicei generat de npm install și este, de asemenea, citit de instrumentul nostru NPM CLI pentru a asigura reproducerea mediilor de construcție pentru proiect cu npm ci.

Cum să comandați eficient NPM Wombats ca „cumpărător”

După cum se deduce din cele 1,3 milioane de pachete publicate față de 16 miliarde de descărcări menționate anterior, majoritatea utilizatorilor npm folosesc npm în această direcție. Deci, este bine să știți cum să folosiți acest instrument puternic.

instalare npm

Aceasta este comanda cea mai frecvent utilizată pe măsură ce dezvoltăm în prezent aplicații JavaScript / Node.js.

În mod implicit, npm install <package-name> va instala cea mai recentă versiune a unui pachet cu ^ semnul versiunii. Un npm install în contextul unui proiect npm va descărca pachete în proiect node_modules dosar conform package.json specificații, actualizarea versiunii pachetului (și, la rândul său, regenerarea package-lock.json) oriunde poate pe baza ^ și ~ potrivirea versiunii.

Puteți specifica un steag global -g dacă doriți să instalați un pachet în context global pe care îl puteți folosi oriunde pe mașina dvs. (acest lucru este obișnuit pentru pachetele de instrumente din linia de comandă, cum ar fi live-server).

npm a făcut instalarea pachetelor JavaScript atât de ușoară încât această comandă este adesea utilizată incorect. Acest lucru are ca rezultat npm să fie fundul multor glume ale programatorilor ca acestea:

1611595508 372 Ce este npm Un tutorial Node Package Manager pentru incepatori

Acesta este locul unde --production steag vine în salvare! În secțiunea anterioară, am discutat dependencies și devDependencies destinat utilizării în producție, respectiv dezvoltare / mediu de testare. Acest --production steag este modul în care diferențele în node_modules sunt făcute.

Prin atașarea acestui steag la fișierul npm install comanda, vom instala doar pachete de la dependencies, reducând astfel drastic dimensiunea noastră node_modules la tot ceea ce este absolut necesar pentru ca aplicațiile noastre să fie puse în funcțiune.

La fel cum, în timp ce băieții și fetele nu cercetau, nu am adus storcătoare de lămâie la standul nostru de limonadă, nu ar trebui să le aducem devDependencies la producție!

npm ci

Astfel, dacă npm install --production este optim pentru un mediu de producție, trebuie să existe o comandă care să fie optimă pentru dezvoltarea mea locală, testarea configurării?

Raspunsul este npm ci.

La fel ca și cum package-lock.json nu există deja în proiect, este generat ori de câte ori npm install se numește, npm ci consumă acest fișier pentru a descărca versiunea exactă a fiecărui pachet individual de care depinde proiectul.

Acesta este modul în care ne putem asigura că contextul proiectului nostru rămâne exact același pe diferite mașini, indiferent dacă este vorba de laptopurile noastre utilizate pentru dezvoltare sau de medii CI (Continuous Integration), cum ar fi Github Actions.

audit npm

Cu numărul mare de pachete care au fost publicate și care pot fi instalate cu ușurință, pachetele npm sunt susceptibile de autori răi cu intenții rău intenționate, cum ar fi aceste.

Realizând că a existat o problemă în ecosistem, organizația npm.js a venit cu idee de npm audit. Acestea mențin o listă de lacune de securitate pe care dezvoltatorii le pot verifica dependențelor împotriva utilizării npm audit comanda.

npm audit oferă dezvoltatorilor informații despre vulnerabilități și dacă există versiuni cu remedieri la care să faceți upgrade. De exemplu,

1611595508 547 Ce este npm Un tutorial Node Package Manager pentru incepatori

Dacă remedierile sunt disponibile în următoarea versiune non-break actualizări, npm audit fix poate fi folosit pentru a actualiza automat versiunile dependențelor afectate.

Cum să comandați efectiv wombats NPM ca „vânzător”

Am trecut prin modalitatea de a folosi instrumentul CLI NPM ca consumator, dar ce zici de utilizarea eficientă a acestuia ca autor (și de a deveni potențial un expert open source JavaScript?)?

npm publicați

Trimiterea unui pachet către npmjs.com centrul de împlinire este foarte ușor, deoarece trebuie doar să alergăm npm publish. Partea dificilă, care este nu specific autorilor pachetului npm, determină versiunea pachetului.

Regula generală conform semver.org:

  1. Versiunea MAJORĂ când faceți modificări API incompatibile,
  2. Versiunea MINORĂ atunci când adăugați funcționalitate într-o manieră compatibilă înapoi și
  3. Versiunea PATCH când efectuați remedieri de erori compatibile înapoi.

Este și mai important să respectați regula de mai sus atunci când publicați pachetele pentru a vă asigura că nu încălcați codul nimănui, deoarece versiunea implicită care corespunde în npm este ^ (aka următoarea versiune minoră).

❤️ npm ❤️ JavaScript ❤️ Node.js ❤️

Asta este tot ce trebuie să știm pentru a începe să folosim npm eficient și pentru a comanda minunata noastră armată de wombats!

1611595508 423 Ce este npm Un tutorial Node Package Manager pentru incepatori