03 β npm va package.json¶
β¬ οΈ Oldingi: 02 β Modullar: CommonJS va ESM Β· π README Β· Keyingi: 04 β Node uchun zamonaviy JavaScript va globallar β‘οΈ
Bu bobda: dasturchi hayotidagi eng ko'p ishlatiladigan asbob β npm bilan tanishamiz.
package.jsonfaylini ("loyiha pasporti") yaratamiz va uning har bir maydonini tushunamiz. Boshqalar yozgan tayyor kodni (paket)npm installbilan o'rnatamiz,node_modulesvapackage-lock.jsonnima ekanini, NEGA "lock" kerakligini ko'ramiz. SemVer (versiyalash qoidasi) va^/~belgilari aslida nimaga ruxsat berishini aniq o'rganamiz. npm scripts bilan buyruqlarni avtomatlashtirib,npm run devdeb yozadigan darajaga yetamiz, npx bilan paketni o'rnatmasdan ishga tushiramiz. Yakunida real mini-loyiha yaratib, unganodemon,chalk,dayjsni o'rnatib, hammasini birga ishlatamiz.
Muammo: g'ildirakni qayta ixtiro qilmaslik¶
Tasavvur qiling, sizga konsolda rangli matn chiqarish kerak. Yoki sanani 2026-06-12 ko'rinishida chiroyli formatlash kerak. Yoki to'liq veb-server yozish kerak. Bularning har birini noldan yozsangiz β yuzlab qator kod, haftalab vaqt va ko'plab xatolar.
Yaxshi xabar: dunyodagi millionlab dasturchilar bu muammolarni allaqachon hal qilgan va yechimlarini bepul ulashgan. Faqat ularni qanday topish, yuklab olish va loyihangizga ulashni bilish kerak. Aynan shu β npm ning vazifasi.
Bu bob amaliy. Oxirida siz haqiqiy loyiha papkasiga ega bo'lasiz, undagi package.json ni o'qiy olasiz va npm run dev deb terib serverni jonlantirasiz β xuddi professional dasturchilar kabi.
npm nima?¶
npm β Node Package Manager, ya'ni "Node paket boshqaruvchisi". U uch narsani anglatadi:
- Buyruq qatori asbobi β terminalga
npm install ...deb yozadigan dastur. U Node.js bilan birga o'rnatiladi, alohida yuklash shart emas. - Onlayn reestr (ombor) β
registry.npmjs.orgmanzilidagi ulkan kutubxona. Bu yerda 3 milliondan ortiq paket bor β dunyodagi eng katta dasturiy kod ombori. Har biri kimdir yozib, hamma uchun ochiq qilib qo'ygan tayyor kod. - Veb-sayt β npmjs.com β paketlarni qidirib, hujjatlarini, yuklab olinish sonini va xavfsizligini ko'rasiz.
Avval Node va npm o'rnatilganini tekshiramiz:
Chiqishi taxminan v24.12.0 va 11.6.2 bo'ladi (sizniki yangiroq bo'lishi mumkin). Agar "command not found" desa, nodejs.org dan LTS versiyani o'rnating.
π Paket (package) nima? β bu boshqa birovning yozgan, qayta ishlatish uchun tayyor kod bo'lagi. Masalan express β veb-server qurish uchun paket, chalk β matnni ranglash uchun paket. Har bir paketning o'z package.json fayli bor β demak paket ham aslida bir loyiha.
npm vs npx vs paket β uchovini chalkashtirmang¶
Bu uchta so'z yangi boshlovchilarni ko'p chalkashtiradi. Farqi oddiy:
| So'z | Ma'nosi |
|---|---|
| paket | Boshqa birov yozgan kod (masalan express). "Narsa". |
| npm | Paketlarni o'rnatadigan va boshqaradigan asbob. "Do'kon menejeri". |
| npx | Paketni o'rnatmasdan bir marta ishga tushiradigan asbob (npm bilan keladi). "Bir martalik ijara". |
npm paketni kompyuteringizga yuklab qo'yadi (keyin ko'p marta ishlatasiz). npx esa paketni vaqtincha yuklab, ishlatadi va tashlab yuboradi (masalan bir martalik generator). Ikkalasini ham pastda amalda ko'ramiz.
package.json β loyiha pasporti¶
Har bir Node loyihasining markazida bitta fayl turadi: package.json. Bu β loyihangizning "pasporti" yoki "anketasi": uning nomi, versiyasi, qanday paketlarga bog'liqligi va qanday buyruqlar bilan ishga tushishini bir joyda saqlaydi.
Yangi loyiha boshlaymiz. Terminal oching va yozing:
npm init β interaktiv ravishda savol berib package.json yaratadi (nom, versiya, muallif...). -y bayrog'i (--yes qisqartmasi) esa "hamma savolga standart javob ber" deydi β eng tez yo'l. Natijada quyidagi fayl paydo bo'ladi:
{
"name": "salom-npm",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"type": "commonjs"
}
π Eslatma (npm 11): zamonaviy npm npm init -y da "type": "commonjs" ni avtomatik qo'shadi. Biz bu bobda zamonaviy ESM uslubidan foydalanamiz, shuning uchun pastda buni "type": "module" ga o'zgartiramiz.
Asosiy maydonlar¶
Har bir maydonni tushunamiz β bularni bilsangiz, istalgan loyiha package.json ini o'qiy olasiz:
nameβ loyiha nomi. Faqat kichik harf, bo'sh joysiz (salom-npm,mening-bot). Agar paketni npm ga e'lon qilsangiz, bu nom band bo'lmasligi kerak.versionβ loyiha versiyasiMAJOR.MINOR.PATCHko'rinishida (pastda SemVer'da chuqur tushuntiriladi). Yangi loyiha odatda1.0.0dan boshlanadi.typeβ modul tizimi."module"β ESM (import/export);"commonjs"β eski uslub (require). 02-bobda ikkalasini ko'rgandik; biz"module"ishlatamiz.mainβ loyihaning "kirish nuqtasi", ya'ni bosh fayl (odatdaindex.js). Boshqa loyiha sizning paketingizniimportqilsa, aynan shu fayl yuklanadi.scriptsβ qisqa buyruqlar ro'yxati (npm start,npm test...). Eng foydali maydonlardan biri β pastda batafsil.dependenciesβ loyiha ishlashi uchun zarur paketlar (masalanexpress). Foydalanuvchi serveringizni ishga tushirsa, bular kerak.devDependenciesβ faqat dasturlash vaqtida kerak paketlar (masalannodemon, test asboblari). Tayyor mahsulotga kirmaydi.
π‘ npm init -y dan keyin package.json da hali dependencies yo'q β chunki hech narsa o'rnatmadik. Birinchi npm install <paket> dan keyin u o'zi paydo bo'ladi.
Paket o'rnatish: npm install¶
Endi loyihaga birinchi paketni o'rnatamiz. Konsolga rangli matn chiqaradigan mashhur chalk paketini olamiz:
npm install (qisqasi npm i) quyidagilarni qiladi:
chalkni npm reestridan (internetdan) topib yuklaydi.- Uni
node_modules/papkasiga joylaydi. package.jsonningdependenciesga"chalk": "^5.x.x"qatorini qo'shadi.package-lock.jsonfaylini yangilaydi (pastda).
Yana bitta paket β sanalar bilan ishlash uchun dayjs ni qo'shamiz:
Endi package.json ga qarasangiz, dependencies paydo bo'lgan:
--save-dev: dasturchi asboblari¶
Ba'zi paketlar faqat siz kod yozayotganda kerak β foydalanuvchiga emas. Masalan nodemon β kod o'zgarganda serverni avtomatik qayta ishga tushiradigan dasturchi yordamchisi. Bunday paketlarni --save-dev (qisqasi -D) bilan o'rnatamiz:
Bu uni dependencies emas, devDependencies ga yozadi:
π Nega bu farq muhim? Server chalk va dayjs siz ishlamaydi β ular dependencies. Lekin nodemon faqat sizning kompyuteringizda kodni kuzatish uchun β foydalanuvchining serveriga u kerak emas. Productionda npm install --omit=dev deb faqat dependencies ni o'rnatib, joy va vaqtni tejash mumkin.
node_modules/ β paketlarning haqiqiy joyi¶
npm install dan keyin loyihada node_modules/ papkasi paydo bo'ladi. Bu β barcha o'rnatilgan paketlarning haqiqiy fayllari turadigan joy. Bitta paket o'z navbatida boshqa paketlarga bog'liq bo'lishi mumkin (ular ham shu yerga tushadi), shuning uchun node_modules ko'pincha yuzlab papka dan iborat bo'ladi.
β οΈ Muhim qoida: node_modules ni hech qachon Git'ga qo'shmang! U juda katta va package.json dan istalgan vaqt qayta tiklash mumkin. Loyiha ildizida .gitignore fayl yarating va ichiga yozing:
Boshqa dasturchi loyihangizni yuklab olsa, faqat npm install deydi (paketsiz, faylsiz) β npm package.json ni o'qib hammasini qaytadan o'rnatadi.
package-lock.json β NEGA "lock" kerak?¶
npm install dan keyin yana bitta fayl paydo bo'ladi: package-lock.json. Ko'p boshlovchilar uni "keraksiz fayl" deb o'ylab o'chiradi β bu xato. Tushunamiz nega u muhim.
package.json da versiya diapazon bilan yoziladi: "chalk": "^5.6.2". ^ belgisi "5.6.2 va undan yuqori, lekin 6.0.0 dan past har qanday versiya bo'ladi" degani. Demak bugun npm install qilsangiz 5.6.2 tushishi mumkin, bir oydan keyin esa 5.7.0 chiqsa β boshqa versiya tushadi.
Bu xavfli: sizning kompyuteringizda 5.6.2 bilan hammasi ishlaydi, hamkasbingizda esa 5.7.0 tushib, kutilmagan xato chiqishi mumkin. "Menda ishlayapti-ku!" muammosi aynan shundan.
package-lock.json shu muammoni hal qiladi. U har bir paketning (va ularning bog'liqliklarining) aynan qaysi versiyasi o'rnatilganini muhrlab qo'yadi:
{
"node_modules/chalk": {
"version": "5.6.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz"
}
}
Endi loyihani kim yuklab olsa ham, npm install aynan 5.6.2 ni o'rnatadi β chunki lock fayl shuni buyuradi. Bu reproduksiya (qayta tiklanuvchanlik) deyiladi: hamma joyda bir xil versiyalar, demak bir xil xulq-atvor.
π Ikkita faylning vazifasi:
- package.json = "menga nima kerak" (diapazon, odam o'qiydi).
- package-lock.json = "aynan nima o'rnatildi" (qotirilgan, npm o'qiydi).
β
package-lock.json ni Git'ga qo'shing. U jamoadagi hammaning bir xil paketlarda ishlashini kafolatlaydi.
π‘ Productionda (masalan serverga deploy qilganda) npm install o'rniga npm ci (clean install) ishlatiladi: u faqat lock fayldan o'qiydi, juda tez va aniq.
SemVer β versiya raqamlari tili¶
Yuqorida ^5.6.2 belgisini ko'rdik. Bu SemVer (Semantic Versioning, "ma'noli versiyalash") tizimi. Bu butun npm dunyosi tilida gaplashadigan til β uni bilish majburiy.
Versiya uch qismdan iborat: MAJOR.MINOR.PATCH (masalan 1.2.3):
- MAJOR (
1) β buzuvchi o'zgarish. Yangi versiya eski kod bilan mos kelmasligi mumkin.1.xdan2.0.0ga o'tish β "ehtiyot bo'l, kodingni o'zgartirish kerak bo'lishi mumkin". - MINOR (
2) β yangi imkoniyat qo'shildi, lekin eski kod baribir ishlaydi (orqaga mos). - PATCH (
3) β xato tuzatildi, yangi narsa yo'q, hammasi mos.
^ (caret) β eng keng tarqalgan¶
"chalk": "^5.6.2" β ^ (caret) MAJOR ni qotiradi, MINOR va PATCH ni esa yangilashga ruxsat beradi:
- β
5.6.2->5.9.0->5.20.5β ruxsat (minor/patch o'zgaradi, mos qoladi). - β
6.0.0β rad (major o'zgardi, buzilishi mumkin).
Mantiq: SemVer qoidasi bo'yicha bir xil major ichida orqaga moslik saqlanadi, shuning uchun caret xavfsiz "avtomatik yangilanish" beradi.
~ (tilde) β ehtiyotkorroq¶
"chalk": "~5.6.2" β ~ (tilde) faqat PATCH ga ruxsat beradi:
- β
5.6.2->5.6.9β ruxsat (faqat xato tuzatishlari). - β
5.7.0β rad (minor o'zgardi).
Tilde "men faqat xato tuzatishlarini olaman, yangi imkoniyatlarni xohlamayman" degani β barqarorlik muhim joyda.
Qaysisi xavfli?¶
| Yozuv | Ma'no | Xavf darajasi |
|---|---|---|
5.6.2 |
Aniq versiya, hech qachon o'zgarmaydi | π’ eng xavfsiz |
~5.6.2 |
Faqat patch | π’ xavfsiz |
^5.6.2 |
Minor + patch (standart) | π‘ odatda xavfsiz |
* yoki latest |
Har qanday versiya, hatto major | π΄ xavfli |
β οΈ * yoki latest ishlatmang β u ertaga chiqqan 7.0.0 ni ham oladi va loyihangizni to'satdan buzishi mumkin. ^ (standart) yetarli.
β οΈ Maxsus holat β 0.x versiyalar: agar paket hali 1.0.0 ga yetmagan bo'lsa (masalan 0.2.3), u "beqaror" deb hisoblanadi. Bunda ^0.2.3 faqat 0.2.x ga ruxsat beradi (0.3.0 ni emas!) β ya'ni 0 versiyalarda caret tilde kabi ehtiyotkor ishlaydi. Buni bilib qo'ying, ko'pchilik adashadi.
npm scripts β buyruqlarni avtomatlashtirish¶
Endi eng kundalik ishlatiladigan narsa β npm scripts. Bular package.json ning scripts maydonida saqlanadigan, qisqa nom bilan ishga tushadigan buyruqlar.
Avval loyihamizni ESM ga o'tkazamiz va asosiy faylni yozamiz. package.json da "type" ni o'zgartiring:
{
"name": "salom-npm",
"version": "1.0.0",
"type": "module",
"main": "index.js",
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js"
},
"dependencies": {
"chalk": "^5.6.2",
"dayjs": "^1.11.18"
},
"devDependencies": {
"nodemon": "^3.1.10"
}
}
index.js faylini yarating:
import chalk from "chalk";
import dayjs from "dayjs";
const vaqt = dayjs().format("YYYY-MM-DD HH:mm:ss");
console.log(chalk.green.bold("Salom, npm dunyosi!"));
console.log(chalk.blue(`Hozir vaqt: ${vaqt}`));
console.log(chalk.yellow("Bu xabar dayjs va chalk paketlari yordamida chiqdi."));
Endi ishga tushiramiz:
Natija (rangli holda):
Salom, npm dunyosi!
Hozir vaqt: 2026-06-12 12:06:08
Bu xabar dayjs va chalk paketlari yordamida chiqdi.
π Mana siz birinchi marta tashqi paketlarni o'rnatib, ularni import qilib, npm script orqali ishga tushirdingiz!
start, test va boshqalar¶
npm ba'zi nomlarni maxsus biladi:
npm startβscripts.startni ishga tushiradi (npm run startdeb yozsa ham bo'ladi, lekinstartuchunrunshart emas).npm test(yokinpm t) βscripts.testni ishga tushiradi.
Custom (o'zingiz qo'ygan) scriptlar¶
Istalgan nom qo'shishingiz mumkin. Lekin start/test dan tashqari nomlarni ishga tushirishda npm run kerak:
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js",
"salom": "node index.js",
"build": "node build.js"
}
npm run dev # nodemon orqali (kod o'zgarsa qayta ishlaydi)
npm run salom # custom script
npm run build # custom script
π Nega scriptlar foydali? Tasavvur qiling, serveringizni ishga tushirish uchun uzun buyruq kerak: node --env-file=.env --watch src/server.js. Buni har safar terish o'rniga scripts.dev ga yozib qo'yib, faqat npm run dev deysiz. Butun jamoa bir xil buyruqdan foydalanadi β bu standartlashtiruvchi katta qulaylik.
π‘ Qaysi scriptlar borligini ko'rish uchun shunchaki npm run (argumentsiz) deng β u barcha mavjud scriptlarni ro'yxatlaydi.
pre va post β avtomatik ilgaklar¶
npm scriptlarda sehrli qoida bor: agar build nomli script bo'lsa va siz prebuild hamda postbuild nomli scriptlar ham qo'shsangiz, npm ularni avtomatik tartibda ishlatadi:
npm run build deganingizda, npm ketma-ket ishga tushiradi:
Ya'ni pre<nom> β asosiy scriptdan oldin, post<nom> β keyin avtomatik ishlaydi. Bu test oldidan kodni tekshirish, build oldidan eski papkani tozalash kabi ishlar uchun qulay.
npx β o'rnatmasdan ishga tushirish¶
Ba'zan paketni bir martagina ishlatish kerak β masalan loyiha shabloni generatori. Uni doimiy o'rnatib, keyin o'chirish noqulay. Aynan shu yerda npx yordam beradi: u paketni vaqtincha yuklab, ishlatadi va tugaganda tashlaydi.
Natija:
cowsay ni umuman o'rnatmadik β npx uni reestrdan vaqtincha olib ishga tushirdi. Eng mashhur misol β yangi loyiha boshlash:
npx create-react-app mening-saytim # React loyihasi generatori
npx degit user/repo mening-loyiham # shablonni klonlash
π npx loyiha ichida ham foydali: agar paket lokal node_modules da o'rnatilgan bo'lsa (masalan nodemon), npx nodemon index.js deb to'g'ridan ishlatasiz β npx avval lokal o'rnatilganni topadi, faqat topolmasa internetdan oladi. Shuning uchun lokal asboblarni doim npx <asbob> deb chaqirish mumkin.
Global vs lokal o'rnatish¶
Hozirgacha hamma paketni lokal (loyiha ichiga, node_modules ga) o'rnatdik. Bu tavsiya etilgan usul, chunki har loyiha o'z versiyalarini saqlaydi.
Lekin -g (--global) bayrog'i bilan paketni butun tizimga o'rnatish mumkin β u istalgan papkadan ishlaydi:
Lokal (npm i paket) |
Global (npm i -g paket) |
|
|---|---|---|
| Qayerga | Loyiha node_modules ga |
Butun tizimga |
| Kim ko'radi | Faqat shu loyiha | Hamma loyiha |
| Versiya | Har loyihada alohida | Bitta umumiy |
| Qachon | Deyarli doim shu | Faqat CLI asboblar uchun (kamdan-kam) |
β οΈ Maslahat: kutubxonalarni (express, chalk...) hech qachon global o'rnatmang β ular loyihaga tegishli. Global faqat butun tizim bo'ylab ishlatiladigan CLI asboblar uchun (va hatto ularni ham ko'pincha npx bilan ishlatish yaxshiroq). Sabab: global versiya bitta bo'ladi, turli loyihalar turli versiya talab qilsa β ziddiyat chiqadi.
Mashhur paketlar bilan tanishuv¶
Eng ko'p ishlatiladigan bir nechta paket bilan qisqacha tanishamiz β keyingi boblarda ulardan foydalanamiz.
express β veb-server¶
express β Node'da veb-server va API qurish uchun eng mashhur paket. Mana to'liq ishlaydigan misol. Avval o'rnating:
import express from "express";
const app = express();
app.get("/salom", (req, res) => {
res.json({ xabar: "Express paketi npm orqali o'rnatildi!", vaqt: Date.now() });
});
const server = app.listen(3000, async () => {
// Server ko'tarilgach, global fetch bilan o'zimizga so'rov yuboramiz (Node 24)
const javob = await fetch("http://localhost:3000/salom");
const data = await javob.json();
console.log("Status:", javob.status); // 200
console.log("Javob:", data.xabar);
server.close();
});
Bu kod serverni 3000-portda ko'taradi, so'ng Node 24 ning ichki fetch funksiyasi bilan o'ziga so'rov yuborib javobni tekshiradi. Chiqishi:
Express'ni alohida β 09-bobda chuqur o'rganamiz. Hozir muhimi: bir buyruq (npm install express) bilan butun veb-server imkoniyatiga ega bo'ldik.
dotenv β maxfiy sozlamalar¶
dotenv β maxfiy ma'lumotlarni (parol, API kalit, port) koddan ajratib .env faylda saqlash uchun. .env faylini Git'ga qo'shmaysiz, demak sirlar commit'ga tushmaydi.
.env fayli:
app.js:
import "dotenv/config"; // .env faylni o'qib process.env ga yuklaydi
console.log("PORT:", process.env.PORT); // 4000
console.log("APP_NOMI:", process.env.APP_NOMI); // Mening-Ilovam
π‘ Node 24 yangiligi: endi dotenv ham shart emas β Node ichida --env-file bayrog'i bor:
Bu .env ni avtomatik o'qiydi. Lekin dotenv hali ham keng tarqalgan, chunki eski Node versiyalarida ham ishlaydi va qo'shimcha imkoniyatlari bor.
nodemon β avtomatik qayta ishga tushiruvchi¶
nodemon β dasturchi do'sti. Oddiy node index.js da kodni o'zgartirsangiz, qayta node index.js terishingiz kerak. nodemon index.js esa faylni kuzatib turadi va har o'zgarishda serverni avtomatik qayta ishga tushiradi. Shuning uchun u har doim devDependencies ga (--save-dev) o'rnatiladi va scripts.dev da ishlatiladi.
REAL KEYS: kichik CLI loyiha β "Kunlik salom"¶
Endi o'rgangan hamma narsani bitta real mini-loyihada birlashtiramiz. Maqsad: terminalga rangli, sanali salomlashuv chiqaradigan kichik asbob yasash va uni nodemon bilan dasturlash rejimida ishlatish.
1-qadam. Loyiha yaratish:
2-qadam. Paketlarni o'rnatish β ishlash uchun chalk + dayjs, dasturlash uchun nodemon:
3-qadam. package.json ni sozlash β "type": "module" va scriptlar qo'shing:
{
"name": "kunlik-salom",
"version": "1.0.0",
"type": "module",
"main": "index.js",
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js"
},
"dependencies": {
"chalk": "^5.6.2",
"dayjs": "^1.11.18"
},
"devDependencies": {
"nodemon": "^3.1.10"
}
}
4-qadam. index.js β soatga qarab salom beradigan dastur:
import chalk from "chalk";
import dayjs from "dayjs";
const hozir = dayjs();
const soat = hozir.hour();
// Soatga qarab tegishli salomlashuvni tanlaymiz
let salom;
if (soat < 12) {
salom = chalk.yellow.bold("Xayrli tong!");
} else if (soat < 18) {
salom = chalk.cyan.bold("Xayrli kun!");
} else {
salom = chalk.magenta.bold("Xayrli kech!");
}
console.log(salom);
console.log(chalk.green(`Bugun: ${hozir.format("YYYY-MM-DD, dddd")}`));
console.log(chalk.gray(`Soat: ${hozir.format("HH:mm:ss")}`));
5-qadam. Ishga tushirish:
Natija (oqshom ishga tushirilsa):
6-qadam. Dasturlash rejimi. npm run dev deb ishga tushiring β endi index.js ni o'zgartirib saqlasangiz, nodemon dasturni o'zi qayta ishga tushiradi:
Mana, real dasturchi ish jarayoni: paketlarni o'rnatish, ESM bilan kod yozish, scriptlar orqali ishga tushirish va nodemon bilan tez sinash. Bu naqsh keyingi barcha loyihalaringizda takrorlanadi.
Paket xavfsizligi: npm audit¶
Boshqa odamlarning kodini o'rnatish qulay, lekin ba'zi paketlarda xavfsizlik zaifliklari topilishi mumkin. npm bunga maxsus asbob beradi:
U o'rnatilgan barcha paketlarni ma'lum zaifliklar bazasiga solishtirib hisobot beradi:
Agar zaiflik topilsa, ko'pincha avtomatik tuzatish mumkin:
Bu zaif paketlarni xavfsiz versiyaga (SemVer diapazoni doirasida) yangilaydi.
β οΈ Begona paketni o'rnatishdan oldin npmjs.com da uning haftalik yuklab olinishini, oxirgi yangilanishini va ochiq xatolarini ko'rib chiqing. Mashhur, faol paket β xavfsizroq.
"type": "module" β yana bir bor eslatma¶
Bu bobda biz "type": "module" ishlatdik, ya'ni import/export (ESM). Buni doim esda tuting:
"type": "module"bo'lsa β.jsfayllar ESM (import x from "...")."type": "commonjs"(yoki yo'q) bo'lsa β.jsfayllar CommonJS (const x = require("...")).- Aralashtirish kerak bo'lsa: ESM loyihada ataylab CommonJS fayl
.cjskengaytmasi bilan, CommonJS loyihada ESM fayl.mjsbilan yoziladi.
Ko'p paketlar ikkala uslubni ham qo'llaydi. Masalan dayjs ni CommonJS loyihada .cjs faylida shunday ishlatasiz:
// dayjs-cjs.cjs β CommonJS uslubi
const dayjs = require("dayjs");
console.log("CJS orqali dayjs ishladi:", dayjs().format("YYYY-MM-DD"));
β οΈ Ammo chalk ning 5-versiyasi faqat ESM (CommonJS'da require("chalk") ishlamaydi). Bu paketni o'rnatishdan oldin hujjatini o'qish kerakligining yaxshi sababi. Biz zamonaviy ESM ishlatganimiz uchun bunday muammoga duch kelmaymiz.
// β XATO β "type": "module" bo'lgan loyihada require ishlamaydi:
const chalk = require("chalk");
// ReferenceError: require is not defined in ES module scope
To'g'risi β ESM import:
Xulosa¶
- npm β Node bilan keladigan paket boshqaruvchisi; reestrida 3+ million paket bor. paket = boshqa birovning kodi, npm = o'rnatuvchi, npx = o'rnatmasdan ishlatuvchi.
package.jsonβ loyiha pasporti;npm init -ybilan yaratiladi. Asosiy maydonlar:name,version,type,main,scripts,dependencies,devDependencies.npm install <paket>paketninode_modulesga yuklaydi vadependenciesga yozadi;--save-devesadevDependenciesga (dasturchi asboblari).package-lock.jsonaniq versiyalarni muhrlab reproduksiya beradi β uni Git'ga qo'shing,node_modulesni esa qo'shmang.- SemVer
MAJOR.MINOR.PATCH:^major'ni qotiradi (standart, xavfsiz),~faqat patch'ga ruxsat beradi,*/latestβ xavfli. - npm scripts buyruqlarni avtomatlashtiradi:
start/testmaxsus, qolganlarinpm run <nom>;pre/postavtomatik ilgaklar. - npx paketni o'rnatmasdan ishlatadi; global o'rnatish faqat kamdan-kam CLI asboblar uchun.
npm auditzaifliklarni tekshiradi. Zamonaviy uslub β"type": "module"bilan ESM.
Mashqlar¶
Oson¶
-
Yangi
mening-loyihampapkasi yarating, ichidanpm init -yishlating. Hosil bo'lganpackage.jsonni oching vaname,version,main,typemaydonlarining qiymatlarini ayting. -
Quyidagi versiya yozuvlarini "xavfsizdan xavflisiga" tartiblang va har birini qisqacha izohlang:
*,~2.1.0,2.1.0,^2.1.0. -
Loyihaga
dayjsni o'rnating (npm install dayjs).npm install dayjsdan keyinpackage.jsonning qaysi maydoni o'zgardi va qaysi yangi fayl/papka paydo bo'ldi? Uchtasini sanang.
O'rta¶
-
package.jsongasalomnomli custom script qo'shing, unode index.jsni ishga tushirsin. Keyinindex.jsda bittaconsole.logyozing va scriptni to'g'ri buyruq bilan ishga tushiring. (Savol:npm salomishlaydimi yokinpm run salomkerakmi? Nega?) -
^1.4.2diapazoni quyidagi versiyalardan qaysilariga ruxsat beradi:1.4.5,1.9.0,2.0.0,1.4.1? Har biriga "ha/yo'q" va sababini yozing. -
chalkpaketini o'rnatib, ESM (import) bilan terminalga qizil xatolik xabari va yashil muvaffaqiyat xabari chiqaradigan dastur yozing.package.jsonda"type": "module"borligiga ishonch hosil qiling.
Qiyin¶
-
To'liq mini-loyiha yarating:
chalk(dependency),nodemon(devDependency) o'rnatilgan,package.jsondastart(node) vadev(nodemon) scriptlari bor.index.jsjoriy sananidayjsbilan formatlab, rangli chiqarsin. Loyiha tuzilishini va to'liqpackage.jsonni yozing. So'ng tushuntiring: neganodemondevDependenciesda-yu,chalkdependenciesda? -
package-lock.jsonnima uchun kerakligini bir hamkasbingizga tushuntirayotgandek yozing. Misol keltiring:package.jsonda"chalk": "^5.6.2"turibdi. Ikki dasturchi ikki xil vaqtdanpm installqildi β lock fayl bo'lmasa nima sodir bo'lishi mumkin va u bo'lganda nima kafolatlanadi?
Yechim β 5
^1.4.2 caret bo'lib, MAJOR (1) ni qotiradi, MINOR va PATCH ni yangilashga ruxsat beradi. Demak >=1.4.2 va <2.0.0 oralig'i:
1.4.5β β ha (patch oshdi, major bir xil1).1.9.0β β ha (minor oshdi, lekin major hali1).2.0.0β β yo'q (major2ga o'tdi β caret bunga ruxsat bermaydi, buzuvchi o'zgarish bo'lishi mumkin).1.4.1β β yo'q (1.4.2dan past, ya'ni boshlang'ich versiyadan oldingisi).
Asosiy g'oya: caret faqat oldinga, lekin major chegarasi ichida yangilanadi.
Yechim β 7
Loyiha tuzilishi:
kunlik-sana/
βββ node_modules/ (Git'ga qo'shilmaydi)
βββ .gitignore ("node_modules" yozilgan)
βββ package.json
βββ package-lock.json
βββ index.js
Buyruqlar:
package.json ("type": "module" va scriptlar qo'lda qo'shiladi):
{
"name": "kunlik-sana",
"version": "1.0.0",
"type": "module",
"main": "index.js",
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js"
},
"dependencies": {
"chalk": "^5.6.2",
"dayjs": "^1.11.18"
},
"devDependencies": {
"nodemon": "^3.1.10"
}
}
index.js:
import chalk from "chalk";
import dayjs from "dayjs";
const sana = dayjs().format("YYYY-MM-DD HH:mm:ss");
console.log(chalk.green.bold("Joriy sana va vaqt:"));
console.log(chalk.cyan(sana));
Ishga tushirish: npm start (bir martalik) yoki npm run dev (o'zgarishlarni kuzatib).
Nega chalk -> dependencies, nodemon -> devDependencies?
chalk dasturning ishlashi uchun zarur β index.js uni import qiladi, usiz dastur xato beradi. Shuning uchun u dependencies da. nodemon esa faqat dasturlash vaqtida kodni kuzatish uchun yordamchi β tayyor dastur uchun kerak emas (productionda npm run dev ishlatilmaydi). Shuning uchun u devDependencies da. Qoida: "dastur ishlashi uchun kerakmi?" β ha bo'lsa dependencies, faqat siz uchun bo'lsa devDependencies.
Yechim β 8
Tushuntirish:
package.json da versiya diapazon bilan yoziladi: "chalk": "^5.6.2". ^ belgisi "5.6.2 dan boshlab, 6.0.0 dan past istalgan versiya" degani. Demak npm bu yozuvga qarab bir nechta versiyani o'rnatishi mumkin β qaysi biri eng yangisi shu paytda mavjud bo'lsa.
Lock fayl BO'LMASA:
Tasavvur qiling, Ali bugun npm install qildi β o'shanda eng yangi mos versiya 5.6.2 edi, shu tushdi. Bir hafta o'tib Vali xuddi shu loyihani yuklab npm install qildi β endi 5.7.0 chiqib bo'lgan (^ unga ham ruxsat beradi), shuning uchun 5.7.0 tushadi. Natijada Ali va Vali turli versiyalarda ishlaydi. Agar 5.7.0 da biror xulq o'zgargan bo'lsa, Valida xato chiqib, Alida chiqmaydi β "menda ishlayapti-ku!" muammosi. Bu juda chalkash va topish qiyin nosozlik.
Lock fayl BO'LGANDA:
Ali birinchi npm install qilganda npm package-lock.json ga aniq 5.6.2 ni (va barcha ichki bog'liqliklarini aniq versiyalari bilan) yozadi. Bu fayl Git'ga commit qilinadi. Vali loyihani yuklab npm install qilganda npm avval lock faylga qaraydi va aynan 5.6.2 ni o'rnatadi β yangiroq versiya chiqqan bo'lsa ham. Natijada ikkalasi ham bir xil versiyalarda ishlaydi.
Kafolat: package-lock.json β reproduksiya kafolati. U loyiha qaysi mashinada, qachon o'rnatilishidan qat'i nazar, bir xil paket versiyalari o'rnatilishini ta'minlaydi. Shuning uchun uni doim Git'ga qo'shasiz, node_modules ni esa qo'shmaysiz (uni har doim lock fayldan qayta tiklash mumkin).
β¬ οΈ Oldingi: 02 β Modullar: CommonJS va ESM Β· π README Β· Keyingi: 04 β Node uchun zamonaviy JavaScript va globallar β‘οΈ