package.json va npm — scripts, dependencies, npx
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.jsonni git ga qo'shing..gitignorega qo'shmang.node_modules/ni esa git ga qo'shmang —.gitignorega 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