Mundarija (34)
- Bu darsda
- 1. Nega bu kerak?
- 2. vazifalar pasporti
- 2.1 Butun fayl
- 2.2 npm pkg get bilan o'qish
- 3. name: paket nomi
- 3.1 Qoidalar
- 3.2 Scope: @egasi/nom
- 3.3 Nom bandmi?
- 4. version
- 4.1 Nashr uchun majburiy
- 4.2 Ilovada versiya shart emas
- 5. private: tasodifiy nashrdan himoya
- 5.1 Nima qiladi
- 5.2 Tuzoq: --dry-run buni tekshirmaydi
- 6. Tavsif maydonlari va license
- 6.1 Pasportni to'ldiramiz
- 6.2 Har maydon nima uchun
- 6.3 Tuzoq: author.name va EOVERRIDEVALUE
- 6.4 license: SPDX identifikatori
- 7. "type": loyihada va kutubxonada
- 7.1 Qisqa takror
- 7.2 Kutubxonaning "type" i
- 7.3 Tuzoq: CommonJS loyihada ESM-only paket
- 7.4 Uch yechim
- 8. Ko'p uchraydigan xatolar
- 9. Mashqlar
- 1-mashq (oson): vazifalar pasportini o'qing
- 2-mashq (o'rta): bahor-menyu pasporti
- 3-mashq (o'rta): kassa-rang ni tuzating
- 4-mashq (qiyin): eski-kassa ni ESM'ga ko'chiring
- 10. Real ishda
- Xulosa
- Manbalar
package.json pasport maydonlari: name, version, private, license va "type"
Qisqacha: Fayl boshidagi maydonlar — paketning pasporti. Nom (
name) va versiya (version) paketni registrda aniqlaydi,private: trueuni tasodifiy nashrdan saqlaydi. Tavsif maydonlari (description,author,repository) va litsenziya (license) — kim yozgan, kod qayerda va qanday shartda ishlatiladi. Modul tizimi ("type") esa.jsfayllar ESM yoki CommonJS ekanini belgilaydi — loyihangizda ham, kutubxonada ham.
Bu darsda
vazifalarningpackage.jsonini maydonma-maydon o'qiysiz.nameqoidalarini va scope (@login/paket) ni bilasiz.versionvaprivatenashrga qanday ta'sir qilishininpm publish --dry-runbilan tekshirasiz.- Tavsif maydonlarini va
licenseninpm pkg setbilan to'ldirasiz. - Kutubxonaning
"type"i yasaydigan tuzoqni (ERR_REQUIRE_ESM) taniysiz va CommonJS loyihani ESM'ga ko'chirasiz.
Oldin bilishingiz kerak: npm buyruqlari chuqur, CommonJS va ESM bilan o'zaro ishlash, npm'ga birinchi qadam.
1. Nega bu kerak?
O'tgan darsda npm ls vazifalar ni vazifalar@ deb ko'rsatdi — @ dan keyin hech narsa yo'q. Sardor qiziqib, yana bir tajriba qildi. npm publish — paketni registrga chiqaradigan buyruq. --dry-run ("quruq mashq") bilan u hech narsani yubormaydi, faqat nima bo'lishini ko'rsatadi:
npm publish --dry-runnpm warn gitignore-fallback No .npmignore file found, using .gitignore for file exclusion. Consider creating a .npmignore file to explicitly control published files.
npm error Cannot read properties of null (reading 'prerelease')
npm error A complete log of this run can be found in: D:\kurs\npm-cache\_logs\2026-10-07T06_11_57_695Z-debug-0.logTarjima: "null ning prerelease xususiyatini o'qib bo'lmadi". Bu JavaScript'ning ichki xatosi — siz TypeError darsida ko'rgan turdagi xabar. U "versiya yo'q" demaydi, lekin sabab aynan shu. Dars oxirida bunday xabarning ortidagi sababni topa olasiz.
npm'ga birinchi qadam darsida package.json ni "loyiha pasporti" degan edik. Bugun pasportning har bandini o'qiymiz. scripts, bog'liqliklar va kirish nuqtalari — keyingi darslarda.
Maslahat: Chiqishlar 2026-10-07 da Windows 11, Node 24.21.0 va npm 11.19.0 bilan olingan. Sizda yo'llar va vaqtlar boshqacha bo'ladi.
2. vazifalar pasporti
2.1 Butun fayl
Bu vazifalar ning 16-qism oxiridagi package.json i. Sizdagi fayl hozircha qisqaroq: Vite, husky kabi asboblar qism davomida qo'shiladi.
{
"name": "vazifalar",
"private": true,
"type": "module",
"scripts": {
"build": "tsc -b && vite build",
"test": "node --test",
"lint": "eslint .",
"dev": "vite",
…
},
"devDependencies": {
"@commitlint/cli": "21.2.3",
"@commitlint/config-conventional": "21.2.3",
"@eslint/js": "10.0.1",
"@types/node": "24.19.1",
"@typescript/native": "npm:typescript@7.0.2",
"eslint": "10.12.0",
"globals": "17.13.0",
"husky": "9.1.7",
"knip": "6.40.0",
"lint-staged": "17.6.0",
"prettier": "3.9.9",
"rollup-plugin-visualizer": "7.1.1",
"typescript": "npm:@typescript/typescript6@6.0.2",
"typescript-eslint": "8.71.1",
"vite": "8.3.3"
},
"engines": {
"node": ">=24"
},
"dependencies": {
"web-vitals": "6.2.3"
},
"license": "MIT"
}scripts dagi 14 ta buyruqdan to'rttasini qoldirdik (…), ular scripts chuqur darsida. Fayl uzun ko'rinadi, lekin unda faqat sakkizta kalit bor. Ularni guruhlarga ajratamiz — sxemaga qarang, qavs ichida qaysi darsda o'rganilishi:
flowchart LR
P["package.json"] --> A["Pasport<br/>name, private, license<br/>(bugun)"]
P --> T["Modul tizimi<br/>type<br/>(bugun)"]
P --> E["Muhit<br/>engines<br/>(Node versiyasi darsi)"]
P --> S["Buyruqlar<br/>scripts<br/>(scripts darsi)"]
P --> D["Bog'liqliklar<br/>(keyingi dars)"]Bugungi to'rtta maydon:
| Maydon | vazifalar da |
Ma'nosi |
|---|---|---|
name |
"vazifalar" |
paket nomi |
private |
true |
npm'ga chiqarilmaydi |
type |
"module" |
.js fayllar — ESM |
license |
"MIT" |
qanday shartda ishlatish mumkin |
engines ni Node versiya menejerlari darsida qo'shdik. license hozir sizda yo'q — uni LICENSE fayli bilan Ildiz fayllari darsida qo'shamiz. name, private va type esa CommonJS va ESM darsidan beri bor.
2.2 npm pkg get bilan o'qish
npm pkg get faylni ochmasdan maydonlarni chiqaradi. Sizdagi kurs/vazifalar da:
npm pkg get name version private type{
"name": "vazifalar",
"private": true,
"type": "module"
}To'rtta maydon so'radik, uchtasi keldi. version yo'q — npm uni jimgina tashlab ketdi. Ataylabmi? Ha. Buni «version» bo'limida tushuntiramiz.
3. name: paket nomi
3.1 Qoidalar
Nom paketni registrda aniqlaydi, npm ls va lock-faylda ko'rinadi, import da yoziladi. npm nomni maxsus tekshiruvchi bilan sinaydi (npm 11.19.0 ichidagi validate-npm-package-name 7.0.2). Uning javoblari:
| Nom | Ruxsat | npm xabari |
|---|---|---|
bahor-menyu |
— | |
@login/bahor-menyu |
— | |
Bahor |
name can no longer contain capital letters |
|
bahor menyu |
name can only contain URL-friendly characters |
| Nom | Ruxsat | npm xabari |
|---|---|---|
.maxfiy |
name cannot start with a period |
|
_maxfiy |
name cannot start with an underscore |
|
http |
http is a core module name |
|
| 215 harfli nom | name can no longer contain more than 214 characters |
Qisqasi: kichik harflar, raqamlar va - bilan yozing. Bo'sh joy, katta harf, boshida nuqta yoki pastki chiziq — yo'q. http, fs kabi Node'ning o'z modullari nomlari band.
npm init -y papka nomidan nom yasaydi va uni o'zi tuzatadi. Bahor Menyu papkasida:
npm pkg get name"bahor-menyu"Katta harflar kichik bo'ldi, bo'sh joy - ga almashdi. Lekin tuzatib bo'lmaydigan nomda npm init to'xtaydi. .maxfiy papkasida:
npm init -y
npm error Invalid name: ".maxfiy"
npm error A complete log of this run can be found in: D:\kurs\npm-cache\_logs\2026-10-07T06_30_47_511Z-debug-0.log3.2 Scope: @egasi/nom
@typescript/native, @eslint/js — bu scope (soha) li nomlar. @ dan keyingi qism — egasi: npm foydalanuvchisi yoki tashkilot. Faqat typescript jamoasi @typescript/... nomli paket chiqara oladi. Shuning uchun scope soxta nomlardan ham himoya qiladi.
Siz ham o'z nomingiz bilan chiqara olasiz: @login/bahor-menyu (login — npm'dagi foydalanuvchi nomingiz). Scope li paketni birinchi marta chiqarganda --access public kerak, aks holda npm uni yopiq (pullik) paket deb tushunadi.
3.3 Nom bandmi?
Paketni npm'ga chiqarmoqchi bo'lsangiz, nom bo'sh bo'lishi kerak. O'tgan darsdagi npm view shu yerda ham ishlaydi:
npm view bahor-menyunpm error code E404
npm error 404 Not Found - GET https://registry.npmjs.org/bahor-menyu - Not found
npm error 404
npm error 404 The requested resource 'bahor-menyu@*' could not be found or you do not have permission to access it.
npm error 404
npm error 404 Note that you can also install from a
npm error 404 tarball, folder, http url, or git url.
npm error A complete log of this run can be found in: D:\kurs\npm-cache\_logs\2026-10-07T06_14_01_034Z-debug-0.logBu safar E404 — yaxshi xabar: 2026-10-07 holatiga bahor-menyu nomi bo'sh. vazifalar kabi chiqarilmaydigan loyihada esa nom faqat sizga kerak — u band bo'lsa ham farqi yo'q.
Tekshirib ko'ring: Malika yangi papkasini
Bahor_Oshxona 2026deb atadi vanpm init -yqildi. Nom qanday bo'ladi deb o'ylaysiz? Qaysi qoida uchun npm nomni o'zgartiradi?
Javob
npm katta harflarni kichik qiladi va bo'sh joyni - ga almashtiradi: bahor_oshxona-2026. Pastki chiziq nomning o'rtasida ruxsat etilgan — taqiq faqat boshida. Ishonch hosil qilish uchun npm pkg get name qiling.
4. version
4.1 Nashr uchun majburiy
version — semver shaklidagi uch raqam: MAJOR.MINOR.PATCH. Registrda nom@versiya juftligi takrorlanmaydi: bir marta chiqarilgan bahor-menyu@1.0.0 ni qayta yozib bo'lmaydi. Har yangi nashr — yangi versiya.
Versiya noto'g'ri yozilsa, npm aniq aytadi. bahor-menyu da version ni 1.0 qilib:
npm publish --dry-runnpm error Invalid version: "1.0"
npm error A complete log of this run can be found in: D:\kurs\npm-cache\_logs\2026-10-07T06_30_49_432Z-debug-0.log"Yaroqsiz versiya" — uchinchi raqam yetishmaydi. Versiya umuman bo'lmasa esa xabar «Nega bu kerak?» bo'limidagidek tushunarsiz: Cannot read properties of null (reading 'prerelease'). npm versiyani o'qishga urindi, null oldi va undan prerelease (sinov versiyasi belgisi) ni so'radi. Qoida: g'alati npm xatosida avval name va version ni tekshiring.
4.2 Ilovada versiya shart emas
vazifalar — sayt. U npm'ga chiqmaydi, uni hech kim npm i vazifalar qilmaydi. Shuning uchun version unda ma'nosiz va ataylab yo'q. Ilovaning versiyasini foydalanuvchi ko'radigan joyda (sahifadagi v3 yozuvi, Git teglari) yuritamiz.
Vite'ning rasmiy loyiha shabloni (create-vite 9.2.1) ham shunday qiladi: unda "private": true, "version": "0.0.0" va "type": "module" yozilgan. 0.0.0 — "versiya bu yerda muhim emas" degan kelishuv. Bu shablonni Vite I darsida o'zimiz yaratamiz.
5. private: tasodifiy nashrdan himoya
5.1 Nima qiladi
"private": true — "bu paketni hech qachon npm'ga chiqarma". Haqiqiy npm publish bunday paketda darhol to'xtaydi. npm 11.19.0 manba kodidagi xabar (EPRIVATE kodi bilan):
This package has been marked as private. Remove the 'private' field from the package.json to publish it.
Tarjima: "Bu paket private deb belgilangan. Chiqarish uchun package.json dan private maydonini olib tashlang". Ichki loyiha kodi registrga — butun dunyoga — tasodifan chiqib ketmaydi.
5.2 Tuzoq: --dry-run buni tekshirmaydi
bahor-menyu ga "private": true qo'yib, quruq mashq qildik. Chiqish uzun — eng avval oxirgi qatorga qarang:
npm publish --dry-runnpm notice
npm notice package: bahor-menyu@1.0.0
npm notice Tarball Contents
npm notice 595B package.json
npm notice Tarball Details
npm notice name: bahor-menyu
npm notice version: 1.0.0
npm notice filename: bahor-menyu-1.0.0.tgz
npm notice package size: 416 B
npm notice unpacked size: 595 B
npm notice shasum: b29e2cf8ed908564c214e8d140069260d4cd3a2e
npm notice integrity: sha512-GcTkgy5uX4Wvz[...]LNJSR6inJei5g==
npm notice total files: 1
npm notice
npm warn publish This command requires you to be logged in to https://registry.npmjs.org/ (dry-run)
npm notice Publishing to https://registry.npmjs.org/ with tag latest and default access (dry-run)
+ bahor-menyu@1.0.0Oxirgi qator — + bahor-menyu@1.0.0, ya'ni "chiqarildi" (go'yo). private haqida bir og'iz so'z yo'q! npm 11.19.0 da private tekshiruvi faqat haqiqiy yuborish bosqichida turadi, --dry-run esa unga yetib bormaydi. Katta harfli Bahor nomini ham dry-run jim o'tkazdi.
Xulosa: --dry-run — "arxivga nima tushadi?" savoliga javob. U "registr qabul qiladimi?" degan savolga javob bermaydi. Chiqishdagi foydali qatorlar: Tarball Contents — arxivdagi fayllar, filename — arxiv nomi, This command requires you to be logged in — siz npm'ga kirmagansiz.
Diqqat:
privatefaqat npm registriga taalluqli.vazifalarrepozitoriysi GitHub'da ochiq —private: truekodni hech kimdan yashirmaydi. Maxfiy kalit va parollar baribir kodga yozilmaydi (.env darsi).
Tekshirib ko'ring: Sardor
vazifalardanprivateni olib tashladi vanpm publishqildi. Nima bo'ladi?
Javob
Baribir chiqmaydi — version yo'q, npm «Nega bu kerak?» bo'limidagi prerelease xatosi bilan to'xtaydi. Versiya qo'shilsa ham, vazifalar nomi registrda allaqachon band bo'lishi mumkin, Sardor esa npm'ga kirmagan. private: true bu yo'lni birinchi qadamdayoq yopadi va xabari aniq.
6. Tavsif maydonlari va license
6.1 Pasportni to'ldiramiz
Bu maydonlar asosan chiqariladigan paketlar uchun: ular npmjs.com sahifasida va npm view kartasida ko'rinadi. Mashq paketi — kurs/mashqlar/16/04-package-json/bahor-menyu/. npm init -y dan keyin npm pkg set bilan bir nechta maydonni birdan yozamiz:
npm pkg set "description=«Bahor» oshxonasi menyusi va narxlari" \
"keywords[]=menyu" "keywords[]=oshxona" \
"author=Sardor <sardor@example.com>" license=MIT \
repository=github:login/bahor-menyu type=module \
"homepage=https://github.com/login/bahor-menyu#readme" \
"bugs.url=https://github.com/login/bahor-menyu/issues"Buyruq jim tugaydi (chiqish yo'q) — bu muvaffaqiyat belgisi. keywords[]= — massivga element qo'shadi, bugs.url — bugs obyekti ichiga yozadi. \ — bash'da buyruqni keyingi qatorda davom ettirish belgisi.
Endi npm pkg fix — npm odatdagi kamchiliklarni o'zi tuzatadi. Natijadagi fayl:
{
"name": "bahor-menyu",
"version": "1.0.0",
"description": "«Bahor» oshxonasi menyusi va narxlari",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"menyu",
"oshxona"
],
"author": "Sardor <sardor@example.com>",
"license": "MIT",
"type": "module",
"private": true,
"repository": {
"type": "git",
"url": "git+https://github.com/login/bahor-menyu.git"
},
"homepage": "https://github.com/login/bahor-menyu#readme",
"bugs": {
"url": "https://github.com/login/bahor-menyu/issues"
}
}Repozitoriy maydoniga qarang. Biz qisqa github:login/bahor-menyu yozgan edik, npm pkg fix esa uni to'liq obyektga aylantirdi. Buni qilmasangiz, npm publish har safar ogohlantirib, o'zi tuzatadi. private ni oldingi bo'limdagi tajriba uchun alohida qo'ygan edik.
6.2 Har maydon nima uchun
| Maydon | Ma'nosi | Qayerda ko'rinadi |
|---|---|---|
description |
bir gaplik tavsif | npm qidiruvi, npm view |
keywords |
qidiruv so'zlari | npm qidiruvi |
author |
asosiy muallif | npmjs.com sahifasi |
contributors |
boshqa mualliflar (massiv) | npmjs.com sahifasi |
| Maydon | Ma'nosi | Qayerda ko'rinadi |
|---|---|---|
repository |
manba kodi joyi | sahifadagi havola, npm repo |
homepage |
loyiha sayti | sahifadagi havola, npm docs |
bugs |
xato haqida qayerga yozish | npm bugs |
funding |
moddiy yordam havolasi | npm fund |
funding ni o'tgan darsda ko'rgandingiz: 1 package is looking for funding — aynan shu maydon bor paketlar sanalgan.
author ni ikki shaklda yozsa bo'ladi: qator ("Ism <email> (sayt)") yoki obyekt ({ "name": …, "email": … }). Email registrda hammaga ochiq ko'rinadi — shaxsiy emailingizni yozishdan oldin o'ylang.
6.3 Tuzoq: author.name va EOVERRIDEVALUE
npm init -y author ni bo'sh qator ("") qilib yaratadi. Unga obyekt maydonini yozmoqchi bo'lsangiz:
npm pkg set author.name=Sardornpm error code EOVERRIDEVALUE
npm error Property author already exists and is not an Array or Object.
npm error A complete log of this run can be found in: D:\kurs\npm-cache\_logs\2026-10-07T06_15_53_476Z-debug-0.log"author xususiyati allaqachon bor va u massiv ham, obyekt ham emas". .name — obyekt ichiga yozish, author esa qator. Yechim: qator shaklida yozing ("author=Sardor <sardor@example.com>") yoki avval npm pkg delete author qiling. E'tibor bering: bitta buyruqdagi bitta xato hammasini bekor qiladi — qolgan maydonlar ham yozilmaydi.
6.4 license: SPDX identifikatori
license — kodni boshqalar qanday shartda ishlata olishi. Qiymat — SPDX identifikatori: litsenziyalarning xalqaro qisqa nomlari (spdx.org/licenses).
| Identifikator | Ma'nosi |
|---|---|
MIT |
deyarli hamma narsaga ruxsat, mualliflik yozuvi saqlansin |
ISC |
MIT ga o'xshash; npm init -y sukut bo'yicha shuni qo'yadi |
Apache-2.0 |
erkin, patentlar haqida qo'shimcha band bilan |
GPL-3.0-only |
o'zgartirilgan kod ham GPL bilan ochilishi shart |
UNLICENSED |
yopiq kod: ishlatishga ruxsat yo'q |
license maydoni — faqat yorliq. Litsenziyaning to'liq matni LICENSE faylida turadi; ikkalasi bir-biriga mos bo'lishi kerak.
Tuzoq: npm yorliqni tekshirmaydi. "license": "MIT License" (SPDX emas) yozib ko'rdik — npm pkg fix ham, npm publish --dry-run ham indamadi. Litsenziya tekshiradigan asboblar esa bunday yozuvni tanimaydi. Nomni doim SPDX ro'yxatidan aynan ko'chiring.
Tekshirib ko'ring: Jasur aka «Bahor» uchun yopiq kod yozdirdi: hech kim ishlatmasin, npm'ga ham chiqmasin.
package.jsonda qaysi ikki maydon qanday bo'ladi?
Javob
"private": true — npm'ga tasodifan chiqmaydi. "license": "UNLICENSED" — "ishlatishga ruxsat berilmagan" (SPDX'dagi maxsus qiymat). Ikkalasi turli savolga javob beradi: biri nashr haqida, ikkinchisi huquq haqida.
7. "type": loyihada va kutubxonada
7.1 Qisqa takror
CommonJS va ESM darsida Node faylni qaysi tizimda o'qishini o'rgangansiz:
| Fayl | Eng yaqin package.json |
Tizim |
|---|---|---|
.mjs |
ahamiyatsiz | ESM |
.cjs |
ahamiyatsiz | CommonJS |
.js |
"type": "module" |
ESM |
.js |
"type": "commonjs" yoki yo'q |
CommonJS |
Bu qoida Node 24 da .ts fayllarga ham taalluqli. TypeScript'ni o'rnatish darsida node fayl.ts ni ishga tushirgan edingiz. "type": "commonjs" li papkada import bor .ts fayl:
node narx.ts(node:5756) Warning: Failed to load the ES module: D:\kurs\mashqlar\16\04-package-json\kassa-rang\narx.ts. Make sure to set "type": "module" in the nearest package.json file or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
D:\kurs\mashqlar\16\04-package-json\kassa-rang\narx.ts:1
import chalk from "chalk";
^^^^^^
SyntaxError: Cannot use import statement outside a module
at wrapSafe (node:internal/modules/cjs/loader:1861:18)
…
Node.js v24.21.0(at … qatorlari qisqartirildi.) Ogohlantirish tavsiyasi ham .js bilan bir xil: "type": "module" qo'ying. npm init -y esa npm 11 da "type": "commonjs" yozadi. Shuning uchun har yangi loyihada birinchi ish — npm pkg set type=module.
7.2 Kutubxonaning "type" i
"type" faqat sizning package.json ingizda emas. Har bir paketda o'z package.json i bor va u o'z fayllarini qanday o'qishni aytadi. npm view bilan tekshiramiz:
npm view chalk typemodulenpm view chalk@4.1.2 typeBu buyruq esa hech narsa chiqarmaydi: 4.1.2 ning package.json ida type maydoni umuman yo'q.
chalk — terminal matnini bo'yaydigan mashhur paket (picocolors ning kattaroq akasi). 4.1.2 da type yo'q — demak, CommonJS. Hozirgi versiyalarida — module. O'tish 5.0.0 da bo'lgan (2021-11-26, npm view chalk time dan): chalk faqat ESM bo'lib qoldi. O'shanda minglab CommonJS loyiha yangilangach birdan sinib qolgan.
7.3 Tuzoq: CommonJS loyihada ESM-only paket
Buni o'zimiz takrorlaymiz. kurs/mashqlar/16/04-package-json/kassa-rang/ — npm init -y (ya'ni "type": "commonjs"), keyin npm i -E chalk@5.6.2. kassa.js:
const chalk = require("chalk");
console.log(chalk.green("Osh: 35000 so'm"));node kassa.jsD:\kurs\mashqlar\16\04-package-json\kassa-rang\kassa.js:3
console.log(chalk.green("Osh: 35000 so'm"));
^
TypeError: chalk.green is not a function
at Object.<anonymous> (D:\kurs\mashqlar\16\04-package-json\kassa-rang\kassa.js:3:19)
…
Node.js v24.21.0"chalk.green funksiya emas". require xato bermadi-ku? Node 24 require() bilan ESM faylni ham yuklaydi (CommonJS va ESM darsidagi require(esm)). Lekin u modul obyektini qaytaradi: chalk'ning asosiy eksporti uning ichida, default nomi ostida. chalk.green yo'q, chalk.default.green bor. ^ belgisi .green ni ko'rsatmoqda.
Eski Node'larda (22.12 va 20.19 dan oldingi) xabar butunlay boshqacha edi. Node 24 da o'sha xulqni bayroq bilan qaytarib ko'ramiz:
node --no-experimental-require-module kassa.jsD:\kurs\mashqlar\16\04-package-json\kassa-rang\kassa.js:1
const chalk = require("chalk");
^
Error [ERR_REQUIRE_ESM]: require() of ES Module D:\kurs\mashqlar\16\04-package-json\kassa-rang\node_modules\chalk\source\index.js from D:\kurs\mashqlar\16\04-package-json\kassa-rang\kassa.js not supported.
Instead change the require of index.js in D:\kurs\mashqlar\16\04-package-json\kassa-rang\kassa.js to a dynamic import() which is available in all CommonJS modules.
at Object.<anonymous> (D:\kurs\mashqlar\16\04-package-json\kassa-rang\kassa.js:1:15) {
code: 'ERR_REQUIRE_ESM'
}
Node.js v24.21.0Tarjima: "kassa.js dan ES modul chalk\source\index.js ni require() qilish qo'llab-quvvatlanmaydi. require o'rniga dinamik import() ishlating — u hamma CommonJS modullarda bor". Internetdagi ko'p eski savol-javoblar aynan shu xato haqida. Sababi bitta: paketning package.json ida "type": "module".
7.4 Uch yechim
- Loyihani ESM'ga o'tkazish (tavsiya).
npm pkg set type=modulevaimport chalk from "chalk";. Biz sinadik:Osh: 35000 so'mchiqdi (terminalda yashil). - CommonJS'da qolish.
const chalk = require("chalk").default;— Node 24 da ishlaydi, lekin eski Node'da baribirERR_REQUIRE_ESM. - Eski versiyada qolish (
chalk@4) — yangilanish va xavfsizlik tuzatishlarisiz. Faqat vaqtinchalik chora.
Yangi kutubxonalar tobora ko'proq faqat ESM bo'lib chiqmoqda. vazifalar 10-qismdan beri "type": "module" da — bu tuzoq bizga tegmaydi. Lekin eski loyihada ishlasangiz, albatta duch kelasiz.
Tekshirib ko'ring:
npm view picocolors typehech narsa chiqarmaydi.picocolorsnirequirebilan ham,importbilan ham ishlatsa bo'ladimi?
Javob
Ha. type yo'q — paket CommonJS. ESM loyihadan CommonJS paketni import qilish doim ishlaydi (module.exports default import bo'lib keladi — CommonJS va ESM). CommonJS loyihadan require qilish esa o'z-o'zidan ishlaydi. Tuzoq faqat teskari holatda: ESM-only paketni CommonJS'dan require qilganda.
8. Ko'p uchraydigan xatolar
| Xabar | Sabab | Davosi |
|---|---|---|
Invalid name: "..." |
nom qoidaga zid | kichik harf, raqam, - |
Invalid version: "1.0" |
semver emas | uch raqam: 1.0.0 |
Cannot read properties of null (reading 'prerelease') |
version yo'q |
version qo'shing |
EOVERRIDEVALUE |
qatorga obyekt maydoni yozildi | qator shaklida yoki avval delete |
| Xabar | Sabab | Davosi |
|---|---|---|
chalk.green is not a function |
ESM paket require qilindi |
ESM'ga o'ting yoki .default |
ERR_REQUIRE_ESM |
xuddi shu, eski Node'da | ESM'ga o'ting yoki import() |
require is not defined in ES module scope |
ESM faylda require |
import (CommonJS va ESM) |
__dirname is not defined in ES module scope |
ESM faylda __dirname |
import.meta.dirname |
9. Mashqlar
Mashqlar kurs/mashqlar/16/04-package-json/ da.
1-mashq (oson): vazifalar pasportini o'qing
kurs/vazifalar da npm pkg get bilan javob bering:
npm pkg get typenatijasi:npm pkg get privatenatijasi:npm pkg get versionnatijasi:npm lsbirinchi qatorida@dan keyin nega hech narsa yo'q?
Yechim
npm pkg get version{}{} — "bo'sh obyekt": bunday maydon yo'q. npm ls nom va versiyani nom@versiya qilib yozadi; versiya yo'q, shuning uchun vazifalar@. Bu xato emas: vazifalar — sayt, npm'ga chiqmaydi (private: true), versiyasiz ham to'liq ishlaydi.
2-mashq (o'rta): bahor-menyu pasporti
kurs/mashqlar/16/04-package-json/bahor-menyu/danpm init -y.- «Pasportni to'ldiramiz» bo'limidagi
npm pkg setni o'z ismingiz va GitHub loginingiz bilan bajaring (email —example.comli namuna yoki umuman yozmang). npm pkg fix, so'ngnpm publish --dry-run. Arxiv nomi:npm pkg set private=true --jsonqilib, dry-run'ni takrorlang. Natija o'zgardimi?
Yordam: --json — qiymatni JSON sifatida o'qiydi, shunda true qator emas, mantiqiy qiymat bo'ladi. Usiz "true" (qator) yoziladi.
Yechim
Tayyor package.json — «Pasportni to'ldiramiz» bo'limidagidek (ism va login sizniki). Dry-run chiqishining oxiri:
npm publish --dry-runnpm notice
npm notice package: bahor-menyu@1.0.0
npm notice Tarball Contents
npm notice 595B package.json
npm notice Tarball Details
npm notice name: bahor-menyu
npm notice version: 1.0.0
npm notice filename: bahor-menyu-1.0.0.tgz
npm notice package size: 416 B
npm notice unpacked size: 595 B
npm notice shasum: b29e2cf8ed908564c214e8d140069260d4cd3a2e
npm notice integrity: sha512-GcTkgy5uX4Wvz[...]LNJSR6inJei5g==
npm notice total files: 1
npm notice
npm warn publish This command requires you to be logged in to https://registry.npmjs.org/ (dry-run)
npm notice Publishing to https://registry.npmjs.org/ with tag latest and default access (dry-run)
+ bahor-menyu@1.0.04-qadam: o'zgarmadi — --dry-run private ni tekshirmaydi («Tuzoq: --dry-run buni tekshirmaydi» bo'limi). Haqiqiy npm publish esa EPRIVATE bilan to'xtaydi. Haqiqiy npm publish ni bu mashqda ishlatmang. O'z paketingizni chiqarishni kurs oxiridagi open source kutubxona darsida o'rganamiz.
3-mashq (o'rta): kassa-rang ni tuzating
«CommonJS loyihada ESM-only paket» bo'limidagi kassa-rang ni ikki usulda tuzating va har birida node kassa.js ni ishga tushiring:
- A:
"type"ga tegmasdan, faqatrequireqatorini o'zgartirib. - B: loyihani ESM'ga o'tkazib.
Yechim
A — kassa.js (CommonJS qoladi):
// chalk 5 — faqat ESM; require() modul obyektini qaytaradi,
// asosiy (default) eksport esa uning .default xususiyatida
const chalk = require("chalk").default;
console.log(chalk.green("Osh: 35000 so'm"));B — npm pkg set type=module, keyin kassa.js:
import chalk from "chalk";
console.log(chalk.green("Osh: 35000 so'm"));Ikkalasida ham:
node kassa.jsOsh: 35000 so'mTerminalda yashil rangda. B — uzoq muddatli yechim: import hamma Node versiyalarida va bundler'larda bir xil ishlaydi.
4-mashq (qiyin): eski-kassa ni ESM'ga ko'chiring
kurs/mashqlar/16/04-package-json/eski-kassa/ da uch fayl. package.json:
{
"name": "eski-kassa",
"version": "1.0.0",
"private": true,
"type": "commonjs"
}narxlar.js:
// «Bahor» menyusi: taom nomi → narx (so'm)
const prices = {
osh: 35000,
"lag'mon": 28000,
manti: 30000,
"ko'k choy": 5000,
};
function total(order) {
return order.reduce((sum, name) => sum + prices[name], 0);
}
module.exports = { prices, total };chek.js:
const path = require("node:path");
const { total } = require("./narxlar.js");
const order = ["osh", "osh", "ko'k choy"];
console.log("Papka:", path.basename(__dirname));
console.log("Buyurtma:", order.join(", "));
console.log("Jami:", total(order), "so'm");node chek.js hozir shunday chiqaradi:
node chek.jsPapka: eski-kassa
Buyurtma: osh, osh, ko'k choy
Jami: 75000 so'mVazifa: loyihani ESM'ga ko'chiring — "type": "module", require yo'q. Chiqish harfma-harf bir xil qolsin. Qadamma-qadam boring: har o'zgarishdan keyin node chek.js va xatoni o'qing. Yordam: __dirname ning ESM'dagi o'rinbosari — import.meta.dirname (CommonJS va ESM).
Yechim
1-qadam: npm pkg set type=module → node chek.js:
ReferenceError: require is not defined in ES module scope, you can use import insteadEndi .js — ESM, unda require yo'q.
2-qadam: chek.js da require larni import ga almashtirdik, narxlar.js esa hali eski:
SyntaxError: The requested module './narxlar.js' does not provide an export named 'total'"./narxlar.js moduli total nomli eksport bermaydi". narxlar.js ESM sifatida o'qilmoqda, module.exports esa ESM'da eksport emas.
3-qadam: narxlar.js da e'lonlar oldiga export qo'ydik, module.exports qatorini o'chirdik:
ReferenceError: __dirname is not defined in ES module scope4-qadam: __dirname → import.meta.dirname. Yakuniy narxlar.js:
// «Bahor» menyusi: taom nomi → narx (so'm)
export const prices = {
osh: 35000,
"lag'mon": 28000,
manti: 30000,
"ko'k choy": 5000,
};
export function total(order) {
return order.reduce((sum, name) => sum + prices[name], 0);
}Yakuniy chek.js:
import path from "node:path";
import { total } from "./narxlar.js";
const order = ["osh", "osh", "ko'k choy"];
console.log("Papka:", path.basename(import.meta.dirname));
console.log("Buyurtma:", order.join(", "));
console.log("Jami:", total(order), "so'm");node chek.jsPapka: eski-kassa
Buyurtma: osh, osh, ko'k choy
Jami: 75000 so'mChiqish bir xil. Uch xato — ko'chirishning uch qadami: require → import, module.exports → export, __dirname → import.meta.dirname. Har birini Node aniq aytdi — faqat xabarni o'qish kerak edi.
10. Real ishda
- Begona loyihani ochganda birinchi qaraladigan fayl —
package.json: nomi,private,type, litsenziyasi."type": "commonjs"yokitypeumuman yo'q bo'lsa — eski kod, yangi ESM-only paketlar bilan ehtiyot bo'ling. - Kutubxona tanlashda
npm view <paket> license type— huquqiy va texnik moslik bitta buyruqda. Kompaniyalar ko'pincha GPL litsenziyali paketlarni yopiq mahsulotga qo'shishni taqiqlaydi. - Ichki paketlar (kompaniya ichida bo'lishiladigan) scope bilan nomlanadi:
@kompaniya/ui. - Intervyu: "
private: truenima qiladi?", "type: modulenimaga ta'sir qiladi?", "ERR_REQUIRE_ESMqachon chiqadi va qanday tuzatiladi?".
Xulosa
- Pasport:
name(kichik harf, URL'ga xavfsiz, ≤ 214),version(semver; nashr uchun majburiy, ilovada shart emas),private(nashrdan himoya). npm pkg get/set/delete/fix—package.jsonni buyruq bilan o'qish va yozish;--json— mantiqiy va son qiymatlar uchun.description,keywords,author,repository,homepage,bugs,funding— chiqariladigan paket kartasi.license— SPDX identifikatori (MIT,ISC,Apache-2.0,UNLICENSED); npm uni tekshirmaydi.npm publish --dry-runarxiv tarkibini ko'rsatadi, lekinprivateva nom qoidalarining hammasini tekshirmaydi."type"har paketda bor: ESM-only kutubxona CommonJS loyihadachalk.green is not a functionyoki eski Node'daERR_REQUIRE_ESMberadi. Yechim — loyihani ESM'ga o'tkazish.
Keyingi dars: package.json II: bog'liqlik turlari — dependencies, devDependencies, peerDependencies va boshqalar. U yerda npm ls --omit=dev nega bo'sh chiqqanini aniqlaymiz.
Manbalar
- npm Docs (v11): package.json, npm pkg, npm publish
- SPDX License List — litsenziya identifikatorlari
- Node.js Docs (v24): Modules: Packages — "type", Loading ECMAScript modules using require()
- npm manba kodi:
libnpmpublish(EPRIVATEtekshiruvi) — github.com/npm/cli
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!