Lompat ke konten
Kembali ke modul

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.

json
{
  "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
}
Ini versi ringkas dari file milik proyek ini sendiri. "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.

BagianDinaikkan saatHaruskah ia merusakmu?
MAJOR — 2.0.0Ada yang sengaja dirusakYa, siapkan pekerjaan
MINOR — 1.3.0Ada fitur ditambahkan, tidak ada yang dibuangTidak
PATCH — 1.2.4Sebuah bug diperbaikiTidak

Awalan di depan sebuah versi memberitahu package manager seberapa besar kebebasannya.

RentangMengizinkanArtinya
1.2.3tepat 1.2.3Tanpa kebebasan. Reproduksibilitas maksimum.
^1.2.3>= 1.2.3 dan < 2.0.0Patch dan fitur, tanpa perubahan yang merusak
~1.2.3>= 1.2.3 dan < 1.3.0Hanya patch
>=1.2.3apa pun yang lebih baru, selamanyaBerbahaya — mengizinkan versi major
* atau latestapa punJangan pernah lakukan ini
Coba sendiri

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.json lalu 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 ci melakukannya; padanan bun-nya bun 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

package.json-mu menyebut ^0.2.3. Apakah bun update akan meng-install 0.3.0?

Pilih jawaban dulu