IlmHamroh
JavaScript Full-stack/16-qism. Frontend asboblari: npm, bundlerlar, config4/48-dars21 daqiqa
Mundarija (34)

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: true uni tasodifiy nashrdan saqlaydi. Tavsif maydonlari (description, author, repository) va litsenziya (license) — kim yozgan, kod qayerda va qanday shartda ishlatiladi. Modul tizimi ("type") esa .js fayllar ESM yoki CommonJS ekanini belgilaydi — loyihangizda ham, kutubxonada ham.

Bu darsda

  • vazifalar ning package.json ini maydonma-maydon o'qiysiz.
  • name qoidalarini va scope (@login/paket) ni bilasiz.
  • version va private nashrga qanday ta'sir qilishini npm publish --dry-run bilan tekshirasiz.
  • Tavsif maydonlarini va license ni npm pkg set bilan 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:

bash
npm publish --dry-run
text
npm 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.log

Tarjima: "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.

json
{
  "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:

bash
npm pkg get name version private type
text
{
  "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:

bash
npm pkg get name
text
"bahor-menyu"

Katta harflar kichik bo'ldi, bo'sh joy - ga almashdi. Lekin tuzatib bo'lmaydigan nomda npm init to'xtaydi. .maxfiy papkasida:

bash
npm init -y
text

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.log

3.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:

bash
npm view bahor-menyu
text
npm 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.log

Bu 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 2026 deb atadi va npm init -y qildi. 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:

bash
npm publish --dry-run
text
npm 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:

bash
npm publish --dry-run
text
npm 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.0

Oxirgi 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: private faqat npm registriga taalluqli. vazifalar repozitoriysi GitHub'da ochiq — private: true kodni hech kimdan yashirmaydi. Maxfiy kalit va parollar baribir kodga yozilmaydi (.env darsi).

Tekshirib ko'ring: Sardor vazifalar dan private ni olib tashladi va npm publish qildi. 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:

bash
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:

json
{
  "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:

bash
npm pkg set author.name=Sardor
text
npm 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.json da 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:

bash
node narx.ts
text
(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:

bash
npm view chalk type
text
module
bash
npm view chalk@4.1.2 type

Bu 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:

js
const chalk = require("chalk");

console.log(chalk.green("Osh: 35000 so'm"));
bash
node kassa.js
text
D:\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:

bash
node --no-experimental-require-module kassa.js
text
D:\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.0

Tarjima: "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

  1. Loyihani ESM'ga o'tkazish (tavsiya). npm pkg set type=module va import chalk from "chalk";. Biz sinadik: Osh: 35000 so'm chiqdi (terminalda yashil).
  2. CommonJS'da qolish. const chalk = require("chalk").default; — Node 24 da ishlaydi, lekin eski Node'da baribir ERR_REQUIRE_ESM.
  3. 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 type hech narsa chiqarmaydi. picocolors ni require bilan ham, import bilan 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 type natijasi:
  • npm pkg get private natijasi:
  • npm pkg get version natijasi:
  • npm ls birinchi qatorida @ dan keyin nega hech narsa yo'q?
Yechim
bash
npm pkg get version
text
{}

{} — "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

  1. kurs/mashqlar/16/04-package-json/bahor-menyu/ da npm init -y.
  2. «Pasportni to'ldiramiz» bo'limidagi npm pkg set ni o'z ismingiz va GitHub loginingiz bilan bajaring (email — example.com li namuna yoki umuman yozmang).
  3. npm pkg fix, so'ng npm publish --dry-run. Arxiv nomi:
  4. npm pkg set private=true --json qilib, 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:

bash
npm publish --dry-run
text
npm 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.0

4-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, faqat require qatorini o'zgartirib.
  • B: loyihani ESM'ga o'tkazib.
Yechim

A — kassa.js (CommonJS qoladi):

js
// 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:

js
import chalk from "chalk";

console.log(chalk.green("Osh: 35000 so'm"));

Ikkalasida ham:

bash
node kassa.js
text
Osh: 35000 so'm

Terminalda 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:

json
{
  "name": "eski-kassa",
  "version": "1.0.0",
  "private": true,
  "type": "commonjs"
}

narxlar.js:

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:

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:

bash
node chek.js
text
Papka: eski-kassa
Buyurtma: osh, osh, ko'k choy
Jami: 75000 so'm

Vazifa: 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:

text
ReferenceError: require is not defined in ES module scope, you can use import instead

Endi .js — ESM, unda require yo'q.

2-qadam: chek.js da require larni import ga almashtirdik, narxlar.js esa hali eski:

text
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:

text
ReferenceError: __dirname is not defined in ES module scope

4-qadam: __dirname → import.meta.dirname. Yakuniy narxlar.js:

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:

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");
bash
node chek.js
text
Papka: eski-kassa
Buyurtma: osh, osh, ko'k choy
Jami: 75000 so'm

Chiqish 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" yoki type umuman 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: true nima qiladi?", "type: module nimaga ta'sir qiladi?", "ERR_REQUIRE_ESM qachon 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.json ni 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-run arxiv tarkibini ko'rsatadi, lekin private va nom qoidalarining hammasini tekshirmaydi.
  • "type" har paketda bor: ESM-only kutubxona CommonJS loyihada chalk.green is not a function yoki eski Node'da ERR_REQUIRE_ESM beradi. 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

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
package.json pasport maydonlari: name, version, private, license va "type" — IlmHamroh