Apa itu npm? Tutorial Pengurus Pakej Node untuk Pemula

Artikel ini semestinya berfungsi sebagai panduan penting all-in-one untuk sidekick kegemaran Node.js: npm.

Node.js telah menerajui dunia sejak 2009. Ratusan ribu sistem telah dibina menggunakan Node.js, mendorong komuniti pemaju untuk mendakwa bahawa "JavaScript adalah perisian makan".

Salah satu faktor utama kejayaan Node adalah npm - pengurus pakejnya yang popular, yang membolehkan pembangun JavaScript berkongsi pakej berguna seperti lodash dan momen dengan cepat dan mudah.

Pada masa ini saya menulis catatan ini, npm telah memudahkan penerbitan lebih daripada 1.3 juta pakej dengan kadar muat turun mingguan lebih dari 16 bilion! Angka-angka ini sangat sesuai untuk sebarang alat perisian. Jadi sekarang mari kita bincangkan apa sebenarnya npm.

Apa itu NPM?

NPM - atau "Pengurus Pakej Node" - adalah pengurus pakej lalai untuk Node.js.

Ia juga dikenali sebagai "Ninja Pumpkin Mutants", "Nonprofit Pizza Makers", dan sebilangan besar nama rawak lain yang boleh anda terokai dan mungkin menyumbang kepada lebih lanjut pada pengembangan npm.

NPM terdiri daripada dua bahagian utama:

  • alat CLI (antara muka baris perintah) untuk menerbitkan dan memuat turun pakej, dan
  • repositori dalam talian yang menghoskan pakej JavaScript

Untuk penjelasan yang lebih visual, kita dapat memikirkan repositori npmjs.com sebagai pusat pemenuhan yang menerima bungkusan barang dari penjual (penulis pakej npm) dan mengedarkan barang ini kepada pembeli (pengguna pakej npm).

Untuk mempermudah proses ini, pusat pemenuhan npmjs.com menggunakan pasukan wombat yang rajin (npm CLI) yang akan ditugaskan sebagai pembantu peribadi kepada setiap pelanggan npmjs.com. Oleh itu, pergantungan dihantar kepada pembangun JavaScript seperti ini:

dan proses menerbitkan pakej untuk rakan JS anda akan seperti ini:

Mari lihat bagaimana pasukan rahim ini membantu pembangun yang ingin menggunakan pakej JavaScript dalam projek mereka. Kami juga akan melihat bagaimana mereka membantu ahli sihir sumber terbuka mengeluarkan perpustakaan mereka yang hebat ke dunia.

pakej.json

Setiap projek dalam JavaScript - sama ada Node.js atau aplikasi penyemak imbas - dapat dicakup sebagai paket npm dengan maklumat pakejnya sendiri dan package.jsontugasnya untuk menggambarkan projek tersebut.

Kita boleh menganggapnya package.jsonsebagai label yang dicop pada kotak-kotak yang baik yang dihantar oleh tentera Wombat kita.

package.jsonakan dihasilkan ketika npm initdijalankan untuk memulakan projek JavaScript / Node.js, dengan metadata asas ini disediakan oleh pemaju:

  • name: nama perpustakaan / projek JavaScript anda
  • version: versi projek anda. Sering kali, untuk pengembangan aplikasi, bidang ini sering diabaikan kerana tidak ada keperluan yang jelas untuk membuat librai opensource. Tetapi tetap dapat digunakan sebagai sumber versi penyebaran.
  • description: keterangan projek
  • license: lesen projek

skrip npm

package.jsonjuga menyokong scriptssifat yang dapat ditentukan untuk menjalankan alat baris perintah yang dipasang dalam konteks tempatan projek. Contohnya, scriptsbahagian projek npm boleh kelihatan seperti ini:

{ "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" } } 

dengan eslint, prettier, ncc, jesttidak semestinya dipasang sebagai executable global tetapi sebaliknya sebagai tempatan di dalam projek anda node_modules/.bin/.

Pengenalan npx baru-baru ini membolehkan kita menjalankan node_modulesperintah-projek ini seperti program yang dipasang secara global dengan awalan npx ...(iaitu npx prettier --write **/*.ts).

kebergantungan vs devDependencies

Kedua-duanya datang dalam bentuk objek nilai kunci dengan nama perpustakaan npm sebagai kunci dan versi berformat semantik sebagai nilai. Ini adalah contoh dari templat ActionScript Type 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" } } 

Pergantungan ini dipasang melalui npm installarahan dengan --savedan --save-devbendera. Mereka dimaksudkan untuk digunakan untuk produksi dan pengembangan / lingkungan uji masing-masing. Kami akan melihat lebih mendalam mengenai pemasangan pakej-pakej ini di bahagian seterusnya.

Sementara itu, penting untuk memahami kemungkinan tanda yang muncul sebelum versi semantik (dengan andaian anda telah membaca major.minor.patchmodel semver):

  • ^: keluaran kecil terkini. Sebagai contoh, ^1.0.4spesifikasi mungkin memasang versi 1.3.0jika itu adalah versi kecil terbaru dalam 1siri utama.
  • ~: pelepasan patch terkini. Dengan cara yang sama seperti ^untuk rilis minor, ~1.0.4spesifikasi mungkin memasang versi 1.0.7jika itu adalah versi minor terbaru dalam 1.0seri minor.

Semua versi paket yang tepat ini akan didokumentasikan dalam package-lock.jsonfail yang dihasilkan .

pakej-lock.json

Fail ini menerangkan versi tepat dari kebergantungan yang digunakan dalam projek JavaScript npm. Sekiranya package.jsonlabel deskriptif generik, package-lock.jsonadalah jadual ramuan.

Dan seperti bagaimana kita biasanya tidak membaca jadual ramuan produk (kecuali anda terlalu bosan atau perlu tahu), package-lock.jsontidak dimaksudkan untuk dibaca baris demi baris oleh pemaju (kecuali jika kita terdesak untuk menyelesaikannya " berfungsi dalam masalah mesin saya).

package-lock.jsonbiasanya dihasilkan oleh npm installperintah, dan juga dibaca oleh alat CLI NPM kami untuk memastikan pembiakan persekitaran binaan untuk projek dengan npm ci.

Cara memerintah NPM Wombats secara berkesan sebagai "pembeli"

Seperti yang disimpulkan dari 1.3 juta pakej yang diterbitkan berbanding 16 bilion muat turun yang disebutkan sebelumnya, majoriti pengguna npm menggunakan npm ke arah ini. Oleh itu, adalah baik untuk mengetahui cara menggunakan alat yang kuat ini.

pasang npm

Ini adalah perintah yang paling biasa digunakan ketika kita mengembangkan aplikasi JavaScript / Node.js sekarang.

Secara lalai, npm install akan memasang versi terbaru pakej dengan ^tanda versi. Dalam npm installkonteks projek npm akan memuat turun pakej ke dalam node_modulesfolder projek mengikut package.jsonspesifikasi, meningkatkan versi paket (dan seterusnya menghasilkan semula package-lock.json) di mana sahaja berdasarkan ^dan ~pencocokan versi.

Anda boleh menentukan bendera global -gjika anda ingin memasang pakej dalam konteks global yang boleh anda gunakan di mana sahaja di mesin anda (ini biasa untuk pakej perkakas baris perintah seperti pelayan langsung).

npm telah membuat pemasangan pakej JavaScript dengan begitu mudah sehingga arahan ini sering digunakan dengan tidak betul. Ini mengakibatkan npm menjadi tunjang banyak lelucon pengaturcara seperti ini:

Di sinilah --productionbendera menyelamatkan diri! Pada bagian sebelumnya, kami membincangkan dependenciesdan devDependenciesdimaksudkan untuk penggunaan dalam produksi dan pengembangan / lingkungan uji masing-masing. Ini --productionbendera adalah bagaimana perbezaan node_modulesdibuat.

Dengan melampirkan bendera ini pada npm installperintah, kami hanya akan memasang pakej dari dependencies, sehingga secara drastik mengurangkan ukuran kami node_modulesmenjadi apa pun yang benar-benar diperlukan agar aplikasi kami dapat berjalan dan berjalan.

Sama seperti bagaimana pengakap lelaki dan perempuan kita tidak membawa peras lemon ke gerai limun kita, kita juga tidak boleh devDependenciesmembuat produksi!

npm ci

Oleh itu, jika npm install --productionoptimum untuk persekitaran pengeluaran, mesti ada perintah yang sesuai untuk pembangunan tempatan saya, menguji persediaan?

Jawapannya ialah npm ci.

Sama seperti bagaimana jika package-lock.jsonbelum ada dalam projek itu dihasilkan setiap kali npm installdipanggil, npm cimenggunakan fail ini untuk memuat turun versi tepat dari setiap pakej individu yang bergantung pada projek.

This is how we can make sure that the our project's context stays exactly the same across different machines, whether it's our laptops used for development or CI (Continuous Integration) build environments like Github Actions.

npm audit

With the humongous number of packages that have been published and can easily be installed, npm packages are susceptible to bad authors with malicious intentions like these.

Realising that there was an issue in the ecosystem, the npm.js organisation came up with the idea of npm audit. They maintain a list of security loopholes that developers can audit their dependencies against using the npm audit command.

npm audit gives developers information about the vulnerabilities and whether there're versions with remediations to upgrade to. For example,

If the remediations are available in the next non-breaking version upgrades, npm audit fix can be used to upgrade the affected dependencies' versions automatically.

How to effectively command NPM wombats as "seller"

We have gone through how to wield the NPM CLI tool as a consumer, but what about effectively using it as an author (and potentially becoming a JavaScript open source wizard ?)?

npm publish

Sending a package to our npmjs.com fulfillment centre is super easy as we only need to run npm publish. The tricky part, which is not specific to npm package authors, is determining the version of the package.

The rule of thumb according to semver.org:

  1. MAJOR version when you make incompatible API changes,
  2. MINOR version when you add functionality in a backwards compatible manner, and
  3. PATCH version when you make backwards compatible bug fixes.

It's even more important to follow the above rule when publishing your packages to ensure that you're not breaking anyone's code as the default version matching in npm is ^ (aka the next minor version).

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

That's all we need to know to start wielding npm effectively and command our lovely army of wombats!