Menu

Dasar npm: install, init, update, dan Mengelola Dependensi

Cara kerja npm yang sebenarnya: menginstal package, init, dev dependency, update, dan model mental di balik node_modules serta lockfile.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Apa Sebenarnya npm Itu

npm adalah tiga hal yang dibungkus dalam satu nama. Ia adalah registry, yaitu database publik raksasa berisi package JavaScript di npmjs.com. Ia adalah tool command-line yang ikut terpasang bersama Node.js untuk menginstal dan mengelola package-package itu. Dan ia adalah spesifikasi (format package.json) yang menjelaskan apa yang dibutuhkan sebuah proyek.

Saat kamu menjalankan npm install express, CLI menghubungi registry, mengunduh express beserta semua yang menjadi dependensinya, menaruh file-file itu di folder bernama node_modules, lalu mencatat package dan versinya di package.json. Itulah seluruh alurnya.

Kalau Node.js sudah terinstal, npm juga sudah ada. Cek:

node --version
npm --version

Kalau keduanya mencetak versi, kamu sudah siap.

Memulai Proyek: npm init

Setiap proyek npm butuh package.json. Itulah manifest-nya: berisi nama proyek, versi, script, dan dependensi. Cara tercepat membuatnya adalah npm init -y, yang menerima semua nilai default:

mkdir my-app
cd my-app
npm init -y

Perintah itu menulis sesuatu seperti ini:

{
  "name": "my-app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

Hilangkan -y dan npm akan memandumu mengisi setiap field secara interaktif. Apa pun caranya, kamu akan mendapat package.json, file yang menjadi pusat segalanya. Kita akan membahas field-field-nya secara detail di halaman berikutnya.

Menginstal Package

Begitu punya package.json, instal package dengan npm install (atau npm i sebagai singkatannya):

npm install lodash

Tiga hal terjadi:

  1. npm mengunduh lodash beserta dependensinya ke node_modules/.
  2. npm menambahkan "lodash": "^4.17.21" (atau versi terbaru apa pun) ke bagian dependencies di package.json.
  3. npm menulis package-lock.json yang mencatat versi pasti setiap package di pohonnya.

Sekarang kamu bisa memakainya:

Panggilan require (atau import di proyek ESM) menemukan package dengan mencarinya di dalam node_modules. Kamu tidak perlu menulis path: module resolver milik Node yang menanganinya.

dependencies vs devDependencies

Tidak setiap package dibutuhkan saat aplikasimu berjalan di production. Framework pengujian, linter, dan bundler hanya penting selama development. Instal package seperti itu dengan --save-dev (atau -D):

npm install --save-dev jest
npm install -D eslint prettier

Package-package ini masuk ke devDependencies, bukan dependencies:

{
  "dependencies": {
    "lodash": "^4.17.21"
  },
  "devDependencies": {
    "jest": "^29.7.0",
    "eslint": "^8.57.0",
    "prettier": "^3.2.5"
  }
}

Di server production, npm install --omit=dev melewati bagian dev sepenuhnya, sehingga instalasinya lebih kecil dan cepat. Membagi keduanya dengan benar lebih penting daripada kelihatannya: webpack yang salah tempat di dependencies akan menggemukkan setiap deploy ke production.

Menginstal Semuanya Sekaligus

Saat kamu meng-clone repo yang sudah punya package.json, kamu tidak perlu menyebutkan setiap package. Cukup jalankan:

npm install

Tanpa argumen, npm membaca package.json (dan mengikuti versi pasti di package-lock.json) lalu menginstal seluruh pohonnya ke node_modules. Inilah perintah pertama yang kamu jalankan pada setiap checkout baru.

Itulah juga sebabnya node_modules harus masuk ke .gitignore. Folder itu bisa dibuat ulang dari lockfile, ukurannya besar, dan berubah setiap kali ada yang menjalankan npm install. Commit package.json dan package-lock.json; biarkan orang lain membuat ulang node_modules sendiri.

Memperbarui Package

npm outdated menunjukkan package mana yang tertinggal:

npm outdated

Kamu akan melihat tabel dengan kolom Current, Wanted, dan Latest. Wanted adalah versi terbaru yang diizinkan oleh rentang di package.json (untuk ^4.17.21, apa pun di bawah 5.0.0). Latest adalah versi terbaru yang dirilis, yang mungkin berupa rilis major yang belum kamu pilih.

Untuk memperbarui dalam rentang yang diizinkan:

npm update

Untuk melompat ke versi terbaru yang sebenarnya, termasuk kenaikan versi major, instal package-nya lagi dengan @latest:

npm install lodash@latest

Kenaikan versi major bisa merusak kodemu, karena memang itulah yang ditandakan nomor versinya. Baca changelog sebelum melompatinya.

Menghapus Package

Menghapus package itu simetris:

npm uninstall lodash

Perintah itu menghapusnya dari node_modules dan menghapus entrinya dari package.json. Tambahkan -D kalau package itu dev dependency (npm tetap bisa mengetahuinya, tetapi menuliskannya secara eksplisit menghindari kejutan di script).

Global vs Lokal

Hampir setiap instalasi sebaiknya lokal, yaitu terkunci ke satu proyek di dalam node_modules-nya. Pengecualiannya adalah tool command-line yang ingin kamu pakai di mana saja:

npm install -g typescript
npm install -g http-server

Instalasi global menaruh tool di lokasi untuk seluruh sistem dan entri bin-nya di PATH-mu, jadi kamu bisa menjalankan tsc atau http-server dari direktori mana pun. Tetapi instalasi global tidak tercatat per proyek dan bisa jadi tidak sinkron antar mesin.

Jalan tengah yang lebih baik untuk perintah sekali pakai adalah npx, yang ikut terpasang bersama npm:

npx create-react-app my-app
npx prettier --write .

npx menjalankan sebuah package tanpa menginstalnya secara global: ia mengambilnya saat dibutuhkan, menjalankannya, dan selesai. Untuk tool yang hanya kamu pakai sekali, cara ini lebih rapi daripada instalasi global permanen.

Cheat Sheet Minimal

Perintah yang benar-benar akan kamu pakai sehari-hari:

npm init -y                     # create package.json
npm install                     # install everything in package.json
npm install <pkg>               # add a runtime dependency
npm install -D <pkg>            # add a dev dependency
npm install -g <pkg>            # install a CLI tool globally
npm uninstall <pkg>             # remove a dependency
npm outdated                    # see what's out of date
npm update                      # update within allowed ranges
npm install <pkg>@latest        # jump to the newest version
npm run <script>                # run a script from package.json
npx <pkg>                       # run a package without installing it

Itulah sebagian besar npm. Sisanya, seperti merilis package, workspace, dan scoped package, bisa kamu pelajari saat membutuhkannya.

Apa yang Sebenarnya Ada di node_modules

Satu model mental terakhir. node_modules adalah folder yang kurang lebih datar, berisi setiap package yang menjadi dependensi proyekmu, ditambah semua yang menjadi dependensi package-package itu, secara berantai. Instal satu package dan kamu mungkin menarik seratus package lain, dan itu normal. npm menghapus duplikat sebisa mungkin, jadi dua package yang bergantung pada versi lodash yang sama memakai satu salinan bersama.

Lockfile (package-lock.json) mencatat versi pasti hasil resolusi setiap package tersebut. Itulah yang membuat build bisa direproduksi: dua developer yang menjalankan npm install dari lockfile yang sama mendapat pohon yang identik sampai ke byte-nya, bahkan berbulan-bulan kemudian.

Anggap node_modules sebagai output yang dihasilkan otomatis. Jangan pernah mengubah file di dalamnya, karena perubahanmu akan hilang begitu ada yang menginstal ulang.

Berikutnya: package.json

package.json adalah file yang terus dibaca dan ditulis ulang npm di balik layar. Memahami field-field-nya, seperti scripts, main, type, rentang versi, dan engines, mengubah npm dari kotak hitam menjadi sesuatu yang bisa kamu kendalikan. Itu topik berikutnya.

Pertanyaan yang sering diajukan

Apa itu npm?

npm adalah package manager default untuk Node.js. Ia ikut terpasang bersama Node, menampung registry publik raksasa berisi package JavaScript, dan menyediakan tool command-line untuk menginstal, memperbarui, dan merilis package. Saat kamu menjalankan npm install lodash, npm mengunduh lodash dari registry ke node_modules dan mencatatnya di package.json.

Apa bedanya dependencies dan devDependencies?

dependencies adalah package yang dibutuhkan aplikasimu untuk berjalan di production, misalnya express atau react. devDependencies hanya dibutuhkan saat development atau build, seperti test runner, bundler, dan linter. Kamu menginstal yang kedua dengan npm install --save-dev <pkg> (atau -D). Di production, npm install --omit=dev melewati devDependencies.

Apakah aku perlu meng-commit node_modules ke git?

Tidak. node_modules dengan mudah bisa berukuran ratusan megabyte dan sepenuhnya bisa dibuat ulang dari package.json + package-lock.json. Tambahkan ke .gitignore dan commit lockfile-nya saja. Siapa pun yang meng-clone repo-mu cukup menjalankan npm install dan mendapat pohon dependensi yang persis sama.

Apa arti instalasi npm global vs lokal?

Instalasi lokal (npm install <pkg>) menaruh package di dalam node_modules proyekmu dan mencatatnya di package.json. Instalasi global (npm install -g <pkg>) memasangnya untuk seluruh sistem, biasanya untuk tool command-line yang ingin kamu pakai di mana saja. Utamakan instalasi lokal untuk dependensi proyek agar versinya tetap terkunci per proyek.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai