Node.js, Package, dan Ekosistemnya · 3/7
package.json, semver, dan lockfile
Kenapa `^1.2.3` bisa merusak build-mu jam 3 pagi, dan bagaimana lockfile mencegahnya.
Baca 25 menit
Setelah pelajaran ini kamu bisa
- Menjelaskan setiap field di package.json yang umum
- Membaca rentang semver dan menyebutkan tepat versi mana yang diizinkannya
- Menjelaskan apa yang dicegah oleh lockfile
- Menjelaskan dua aturan khusus caret untuk versi 0.x
package.json adalah kartu identitas sebuah proyek: namanya, apa yang dibutuhkannya, dan perintah apa yang disediakannya. Setiap proyek JavaScript punya satu.
{
"name": "fullstack-learning-path",
"version": "0.1.0",
"private": true, // refuse to publish this to npm by accident
"scripts": {
"dev": "next dev",
"build": "next build",
"test": "vitest run"
},
"dependencies": {
"next": "16.3.0", // exact: only this version
"react": "19.2.8",
"lucide-react": "^1.31.0" // caret: this or any compatible later one
},
"devDependencies": {
"typescript": "^5",
"vitest": "^4.1.10"
},
"packageManager": "bun@1.3.14", // which tool, and which version
"trustedDependencies": ["sharp"] // install scripts allowed to run
}"private": true layak kamu tiru untuk apa pun yang tidak dimaksudkan untuk npm.Semver
Semver — semantic versioning — adalah janji yang dibuat oleh nomor versi. MAJOR.MINOR.PATCH, dan setiap bagiannya punya arti tertentu.
| Bagian | Dinaikkan saat | Haruskah ia merusakmu? |
|---|---|---|
MAJOR — 2.0.0 | Ada yang sengaja dirusak | Ya, siapkan pekerjaan |
MINOR — 1.3.0 | Ada fitur ditambahkan, tidak ada yang dibuang | Tidak |
PATCH — 1.2.4 | Sebuah bug diperbaiki | Tidak |
Awalan di depan sebuah versi memberitahu package manager seberapa besar kebebasannya.
| Rentang | Mengizinkan | Artinya |
|---|---|---|
1.2.3 | tepat 1.2.3 | Tanpa kebebasan. Reproduksibilitas maksimum. |
^1.2.3 | >= 1.2.3 dan < 2.0.0 | Patch dan fitur, tanpa perubahan yang merusak |
~1.2.3 | >= 1.2.3 dan < 1.3.0 | Hanya patch |
>=1.2.3 | apa pun yang lebih baru, selamanya | Berbahaya — mengizinkan versi major |
* atau latest | apa pun | Jangan pernah lakukan ini |
Pencocok caret dan tilde yang berfungsi. Membuatnya adalah cara tercepat memastikan kamu memahami aturannya dengan benar.
Hasil
Tekan Jalankan untuk melihat hasilnya.
Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.
Lockfile
package.json menyebut ^1.2.3, dan itu sebuah rentang. Lockfile — bun.lock, package-lock.json, pnpm-lock.yaml — mencatat satu versi tepat yang benar-benar ter-install, untuk setiap package termasuk yang transitif.
Inilah yang mencegah "di komputer saya jalan". Tanpa lockfile, kamu meng-install 1.2.3 di bulan Maret dan rekanmu meng-install 1.9.0 di bulan Juni — keduanya memenuhi ^1.2.3, dan salah satunya punya regresi.
- Commit lockfile-nya. Selalu. Ia adalah reproduksibilitas build-mu.
- Jangan mengeditnya manual. Ubah
package.jsonlalu jalankan install. - Wajar kalau muncul di diff. Diff lockfile yang besar di PR yang cuma menambah satu package itu normal.
- Di CI, install tepat dari lockfile.
npm cimelakukannya; padanan bun-nyabun install --frozen-lockfile, dan ia gagal alih-alih diam-diam memperbarui.
Tugas praktik
Di proyek ini, temukan lucide-react di package.json dan catat rentangnya. Lalu jalankan cat node_modules/lucide-react/package.json | grep '"version"' untuk melihat versi tepat yang ter-install. Dengan runner di atas, pastikan versi yang ter-install memenuhi rentang yang dideklarasikan. Terakhir, jalankan wc -l bun.lock untuk melihat seberapa detail isi lockfile-nya.
Hasil yang diharapkan
Versi yang ter-install memenuhi rentangnya, dan lockfile-nya ribuan baris.
Cek pemahaman
Pilih jawaban dulu