package.json va npm — scripts, dependencies, npx

~15 daq · Node.js · Kirish va Asoslar

Muammodan boshlaylik

Siz loyiha yozdingiz. Do'stingizga yubordingiz. U node index.js deydi — xato. Nima xato? Siz ishlatgan kutubxonalar uning kompyuterida yo'q. Qaysi kutubxonalar kerak? Qaysi versiyalar? Qanday ishga tushirish kerak?

Aynan shu muammolarni package.json hal qiladi. Bu fayl loyiha haqida hamma narsani biladi.


package.json nima?

package.json — loyihaning "pasporti". Ichida:

  • Loyiha nomi, versiyasi, tavsifi
  • Kerakli kutubxonalar va ularning versiyalari
  • Ishga tushirish buyruqlari
  • Muallif, litsenziya ma'lumotlari

Har bir Node.js loyihasida bu fayl bo'lishi shart.

Yaratish

npm init          # savollar beradi, javob berasiz
npm init -y       # barcha savolga "ha" deydi, tez yaratadi

npm init -y natijasi:

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

Asosiy maydonlar

name va version

{
  "name": "my-api",
  "version": "1.2.3"
}

version — semver (semantic versioning) formatida: MAJOR.MINOR.PATCH.

1.2.3
│ │ └── PATCH — xato tuzatish (1.2.3 → 1.2.4)
│ └──── MINOR — yangi imkoniyat, orqaga mos (1.2.3 → 1.3.0)
└────── MAJOR — katta o'zgarish, orqaga mos emas (1.2.3 → 2.0.0)

main

{
  "main": "src/index.js"
}

Boshqa loyiha bu paketni require qilganda qaysi fayl yuklanishini ko'rsatadi.

type

{
  "type": "module"
}

"module" — barcha .js fayllar ES Modules sifatida yuklanadi. Bo'lmasa — CommonJS (default).


scripts — buyruqlar

scripts — loyihani boshqarish uchun buyruqlar to'plami. npm run <nom> bilan ishga tushiriladi.

{
  "scripts": {
    "start":   "node src/index.js",
    "dev":     "nodemon src/index.js",
    "build":   "tsc",
    "test":    "jest",
    "lint":    "eslint src/",
    "format":  "prettier --write src/"
  }
}

Ishlatish:

npm run start    # node src/index.js
npm run dev      # nodemon src/index.js
npm test         # "test" uchun "run" shart emas
npm start        # "start" uchun ham "run" shart emas

Pre va Post hooks

Har bir script uchun oldin (pre) va keyin (post) ishlaydigan script yozish mumkin:

{
  "scripts": {
    "prebuild":  "echo 'Build boshlanmoqda...'",
    "build":     "tsc",
    "postbuild": "echo 'Build tugadi!'"
  }
}

npm run build deyilganda: prebuild → build → postbuild ketma-ket ishlaydi.


dependencies va devDependencies

dependencies — ishlab chiqarishda kerak

{
  "dependencies": {
    "express":   "^4.18.2",
    "mongoose":  "^7.6.3",
    "dotenv":    "^16.3.1",
    "jsonwebtoken": "^9.0.2"
  }
}

Bu kutubxonalar server ishlaganda kerak. Production serverga ham o'rnatiladi.

npm install express          # dependencies ga qo'shadi
npm install express --save   # (eski npm da kerak edi, hozir avtomatik)

devDependencies — faqat ishlab chiqishda kerak

{
  "devDependencies": {
    "nodemon":   "^3.0.2",
    "jest":      "^29.7.0",
    "eslint":    "^8.54.0",
    "typescript":"^5.3.2"
  }
}

Bu kutubxonalar faqat dastur yozayotganda kerak. Production serverga o'rnatilmaydi.

npm install nodemon --save-dev    # devDependencies ga qo'shadi
npm install nodemon -D            # qisqacha

Versiya belgilari

"express": "4.18.2"    // aniq versiya — faqat shu
"express": "^4.18.2"   // ^ — minor va patch yangilanishi mumkin (4.x.x)
"express": "~4.18.2"   // ~ — faqat patch yangilanishi mumkin (4.18.x)
"express": "*"         // istalgan versiya (xavfli!)
"express": ">=4.0.0"   // 4.0.0 dan katta istalgan versiya

Amalda ko'pincha ^ ishlatiladi — yangi xato tuzatishlar avtomatik keladi, lekin katta o'zgarishlar kelmaydi.


npm buyruqlari

O'rnatish

npm install                  # package.json dagi barcha paketlarni o'rnatadi
npm install express          # bitta paket o'rnatish
npm install express@4.17.1   # aniq versiya
npm install -g nodemon       # global o'rnatish (barcha loyihalarda ishlaydi)

O'chirish

npm uninstall express        # o'chirish
npm uninstall -g nodemon     # global o'chirish

Yangilash

npm update                   # barcha paketlarni yangilash
npm update express           # bitta paketni yangilash
npm outdated                 # eskirgan paketlarni ko'rish

Ma'lumot

npm list                     # o'rnatilgan paketlar
npm list --depth=0           # faqat birinchi daraja
npm info express             # paket haqida ma'lumot

package-lock.json — nima bu?

npm install qilganda package-lock.json fayli yaratiladi. Bu faylni o'zingiz yozmaysiz — npm o'zi yozadi.

{
  "name": "my-project",
  "lockfileVersion": 3,
  "packages": {
    "node_modules/express": {
      "version": "4.18.2",
      "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
      "integrity": "sha512-...",
      "dependencies": { ... }
    }
  }
}

Bu fayl nima uchun kerak? package.json da "express": "^4.18.2" deb yozilgan — bu 4.18.2 dan 4.x.x gacha istalgan versiya bo'lishi mumkin degani. Siz o'rnatganda 4.18.2, do'stingiz o'rnatganda 4.19.0 bo'lishi mumkin.

package-lock.json esa aniq versiyani saqlaydi. Hamma bir xil versiyani o'rnatadi.

💡 package-lock.json ni git ga qo'shing. .gitignore ga qo'shmang. node_modules/ ni esa git ga qo'shmang — .gitignore ga qo'shing.


node_modules — kutubxonalar papkasi

npm install qilganda barcha kutubxonalar node_modules/ papkasiga yuklanadi. Bu papka juda katta bo'lishi mumkin — yuzlab MB.

my-project/
├── node_modules/        ← git ga qo'shilmaydi
│   ├── express/
│   ├── mongoose/
│   └── ...
├── src/
├── package.json
├── package-lock.json    ← git ga qo'shiladi
└── .gitignore

.gitignore fayli:

node_modules/
.env
dist/

Boshqa dasturchi loyihani clone qilganda:

git clone https://github.com/...
cd my-project
npm install    # package-lock.json dan aniq versiyalarni o'rnatadi

npx — o'rnatmasdan ishlatish

npx — npm bilan birga keladigan asbob. Paketni global o'rnatmasdan, to'g'ridan-to'g'ri ishlatish imkonini beradi.

# Global o'rnatmasdan ishlatish
npx create-react-app my-app
npx @nestjs/cli new my-nest-app
npx prisma init

# Aniq versiya bilan
npx create-react-app@5.0.0 my-app

npx qanday ishlaydi:

1. Paket local node_modules da bormi? → ishlatadi
2. Yo'q → npm registry dan vaqtincha yuklab oladi
3. Ishlatadi
4. O'chiradi (cache da qoladi)

npx vs global install

# Eski usul — global o'rnatish
npm install -g create-react-app
create-react-app my-app

# Zamonaviy usul — npx
npx create-react-app my-app

npx afzalligi — har safar eng yangi versiyani ishlatadi. Global o'rnatilgan paket eskirib qolishi mumkin.


To'liq package.json misoli

Real loyihada package.json qanday ko'rinadi:

{
  "name": "my-api",
  "version": "1.0.0",
  "description": "Node.js REST API",
  "main": "src/index.js",
  "type": "module",
  "scripts": {
    "start":   "node src/index.js",
    "dev":     "nodemon src/index.js",
    "test":    "jest --coverage",
    "lint":    "eslint src/",
    "build":   "tsc --outDir dist"
  },
  "dependencies": {
    "express":      "^4.18.2",
    "mongoose":     "^7.6.3",
    "dotenv":       "^16.3.1",
    "bcryptjs":     "^2.4.3",
    "jsonwebtoken": "^9.0.2"
  },
  "devDependencies": {
    "nodemon":   "^3.0.2",
    "jest":      "^29.7.0",
    "eslint":    "^8.54.0"
  },
  "engines": {
    "node": ">=18.0.0"
  },
  "author": "Firdavs",
  "license": "MIT"
}

"engines" — qaysi Node.js versiyasi kerakligini ko'rsatadi. Eski versiyada ishga tushirishga urinsa — ogohlantirish beradi.


Xulosa

package.json — loyihaning pasporti. Kutubxonalar, buyruqlar, versiya — hammasi shu yerda.

dependencies — production da kerak. devDependencies — faqat ishlab chiqishda.

package-lock.json — aniq versiyalarni saqlaydi. Git ga qo'shing.

node_modules — yuklab olingan kutubxonalar. Git ga qo'shmang.

npx — global o'rnatmasdan paket ishlatish. Har safar eng yangi versiya.


Keyingi dars

6-dars: Event Loop nima — brauzer dan farqi, nima uchun muhim