4-bo‘lim
npm va paketlar
package.json maydonlari, bog'liqlik turlari, semver belgilari, package-lock va npm ci, npx hamda bog'liqliklarni xavfsiz tanlash.
Ushbu bo‘lim mundarijasi
npm - Node bilan birga keladigan paket menejeri. U dunyodagi eng katta ochiq kod ombori bilan ishlaydi: u yerda ikki millionga yaqin paket bor.
Paket o'rnatish #
npm install express
npm install --save-dev nodemon
npm install
| Buyruq | Nima qiladi |
|---|---|
npm install <nom> | Paketni o'rnatib, dependencies ga yozadi |
npm install -D <nom> | devDependencies ga yozadi |
npm install | package.json dagi hammasini o'rnatadi |
npm uninstall <nom> | O'chiradi |
O'rnatilgan paketni oddiy modul kabi ishlatasiz:
import express from "express";
console.log(typeof express);
console.log(typeof express().listen);
function
function
Ikki xil bog'liqlik #
{
"type": "module",
"dependencies": {
"express": "^5.2.1"
},
"devDependencies": {
"eslint": "^9.0.0"
}
}
| Turi | Nima uchun | Misol |
|---|---|---|
dependencies | Dastur ishlashi uchun kerak | express |
devDependencies | Faqat ishlab chiqishda kerak | testlar, linter |
Serverga joylashda npm install --omit=dev deb yozsangiz, faqat
birinchi guruh o'rnatiladi - natijada tasvir kichikroq va xavfsizroq
bo'ladi.
Yangi boshlovchilar ko'pincha hammasini dependencies ga yozadi.
Bu xavfsizlik masalasi ham: serverda ishlaydigan har bir paket - bu xavf maydonining bir qismi. Test kutubxonasi ishlab chiqarishda umuman kerak emas.
Oddiy savol: "bu paket foydalanuvchi so'rov yuborganda kerak
bo'ladimi?" Javob yo'q bo'lsa - devDependencies.
Semver - versiya raqamlari #
Node dunyosida versiya uch qismdan iborat: 5.2.1.
function kamEmas(v, t) {
for (let i = 0; i < 3; i++) {
if (v[i] !== t[i]) return v[i] > t[i];
}
return true;
}
function mosmi(talab, versiya) {
const belgi = /^[\^~]/.test(talab) ? talab[0] : "";
const t = talab.replace(/^[\^~]/, "").split(".").map(Number);
const v = versiya.split(".").map(Number);
if (belgi === "") return talab === versiya;
if (!kamEmas(v, t)) return false;
if (belgi === "^") return v[0] === t[0];
return v[0] === t[0] && v[1] === t[1];
}
console.log(mosmi("^5.2.1", "5.9.0"));
console.log(mosmi("^5.2.1", "5.10.0"));
console.log(mosmi("^5.2.1", "6.0.0"));
console.log(mosmi("^5.2.1", "5.2.0"));
console.log(mosmi("~5.2.1", "5.2.9"));
console.log(mosmi("~5.2.1", "5.3.0"));
console.log(mosmi("5.2.1", "5.2.2"));
true
true
false
false
true
false
false
Ikkinchi qatorga e'tibor bering: 5.10.0 versiyasi ^5.2.1 ga
mos keladi, chunki o'ntinchi kichik versiya ikkinchisidan
keyin chiqqan.
Agar taqqoslashni satr bilan qilganimizda, natija false bo'lardi:
satr sifatida "5.10.0" < "5.2.1", chunki belgilar birma-bir
solishtiriladi va "1" < "2".
Shuning uchun yuqoridagi kamEmas funksiyasi har bir qismni
son sifatida solishtiradi. Xuddi shu xato haqiqiy loyihalarda
ham uchraydi - versiyalarni saralaganda ehtiyot bo'ling.
| Yozuv | Ruxsat etadi |
|---|---|
^5.2.1 | 5.2.1 dan 5.x.x gacha |
~5.2.1 | 5.2.1 dan 5.2.x gacha |
5.2.1 | Faqat aynan shu versiya |
* | Istalgan (ishlatmang) |
npm install odatiy holda ^ qo'yadi.
package-lock.json #
"express": "^5.2.1" - bu "5.2.1 yoki undan yangiroq 5.x" degani.
Demak bugun 5.2.1, ertaga 5.4.0 o'rnatilishi mumkin.
Agar shu bilan tugasa, jamoadagi har kimda boshqa versiya bo'lardi va "menda ishlayapti" muammosi paydo bo'lardi.
Aynan shu sababdan package-lock.json bor. Unda haqiqatan
o'rnatilgan aniq versiyalar va ularning barmoq izlari yoziladi -
nafaqat sizning paketlaringiz, balki ularning bog'liqliklari ham.
Shuning uchun package-lock.json albatta git ga qo'shiladi.
npm ci
| Buyruq | Xatti-harakati |
|---|---|
npm install | package.json ga qarab, lock ni yangilashi mumkin |
npm ci | Faqat lock bo'yicha, aynan shunday o'rnatadi |
npm ci serverlar va uzluksiz integratsiya uchun. U tezroq ham
ishlaydi, chunki hisob-kitob qilmaydi.
Yangilash #
npm outdated
npm update
npm install express@latest
npm outdated eskirgan paketlarni ko'rsatadi, npm update esa
^ ruxsat bergan chegarada yangilaydi.
Katta versiyaga o'tish uchun uni ochiq so'rash kerak:
express@latest.
npx #
npx eslint .
npx create-vite mening-loyiham
npx paketni o'rnatmasdan ishga tushiradi. Bir martalik
vositalar uchun juda qulay.
Agar paket loyihada allaqachon bor bo'lsa, npx o'shani ishlatadi -
qayta yuklamaydi.
Xavfsizlik #
npm audit
npm audit fix
npm audit bog'liqliklarda ma'lum zaifliklar bor-yo'qligini
tekshiradi.
npm install yozganingizda, siz begona odamning kodini o'z
serveringizda ishlatishga rozilik bildirasiz.
Bitta paket o'nlab boshqa paketga bog'liq bo'lishi mumkin - va siz ularning hech birini ko'rmagansiz. Bu ta'minot zanjiri xavfi deb ataladi.
Amaliy qoidalar:
- Paket qo'shishdan oldin o'ylang. Uch qatorlik funksiya uchun bog'liqlik olish - yomon savdo.
- Standart kutubxonani tekshiring. Node da bugun juda ko'p
narsa tayyor:
fetch, test yurituvchi,.envo'qish,node:sqlite. Ilgari bularning har biri uchun paket kerak edi. - Paketni tanlashda qarang: oxirgi yangilanish qachon, nechta ochiq muammo bor, nechta bog'liqligi bor.
npm civapackage-lock.jsonishlating - shunda kutilmagan versiya kelib qolmaydi.
Paket nomlari va ombor #
const nomlar = [
"express",
"@types/node",
"@babel/core",
];
for (const nom of nomlar) {
const nomlangan = nom.startsWith("@");
const [soha] = nom.split("/");
console.log(`${nom} -> soha: ${nomlangan ? soha : "yo'q"}`);
}
express -> soha: yo'q
@types/node -> soha: @types
@babel/core -> soha: @babel
@ bilan boshlanadigan nomlar - sohali (scoped) paketlar. Ular
tashkilotga tegishli va nomlar to'qnashuvini oldini oladi.
package.json ni o'qish #
import { readFile } from "node:fs/promises";
const xom = await readFile("package.json", "utf8");
const paket = JSON.parse(xom);
console.log("Turi:", paket.type);
console.log("Nomi bormi:", typeof paket.name === "string");
console.log("express bog'liqlikdami:",
Object.keys(paket.dependencies ?? {}).includes("express"));
Turi: module
Nomi bormi: true
express bog'liqlikdami: true
package.json - oddiy JSON, shuning uchun uni dastur ichidan ham
o'qish mumkin. Ba'zan bu versiya raqamini chiqarish uchun kerak
bo'ladi.
Foydali maydonlar #
{
"name": "mening-loyiham",
"version": "1.0.0",
"type": "module",
"main": "index.js",
"engines": {
"node": ">=20"
},
"scripts": {
"start": "node index.js"
}
}
| Maydon | Ma'nosi |
|---|---|
name, version | Paketning kimligi |
type | module yoki commonjs |
main | Kirish nuqtasi |
engines | Qaysi Node versiyasi kerak |
private: true | Tasodifan nashr qilinmasin |
Agar paketingizni npm ga nashr qilmoqchi bo'lmasangiz,
package.json ga "private": true qo'shing.
Bu tasodifan npm publish yozib, ichki kodni butun dunyoga
ochib qo'yishdan himoya qiladi. npm bunday paketni nashr qilishdan
bosh tortadi.
Ichki loyihalarda buni doim yozing.
npm install expressbilan paket o'rnating.package.jsonda u qayerga yozilganini ko'ring.-Dbilan ishlab chiqish bog'liqligini qo'shing.^va~farqininpm outdatedbilan kuzating.package-lock.jsonni ochib, ichidagini ko'ring.node_modulesni o'chirib,npm cibilan tiklang.npxbilan biror vositani o'rnatmasdan ishlating.npm auditni ishga tushiring.package.jsonni dastur ichidan o'qib chiqaring."private": truevaenginesmaydonlarini qo'shing.
Xulosa #
dependencies- dastur ishlashi uchun;devDependencies- faqat ishlab chiqish uchun.- Semver: MAJOR.MINOR.PATCH;
^katta raqamni,~esa o'rtani qulflaydi. package-lock.jsonaniq versiyalarni saqlaydi va git ga qo'shiladi.- Serverda va CI da
npm ciishlating - u faqat lock bo'yicha o'rnatadi. npxpaketni o'rnatmasdan ishga tushiradi.- Har bir bog'liqlik - ishonch va xavf; qo'shishdan oldin standart kutubxonani tekshiring.
@bilan boshlanadigan nomlar - sohali paketlar.- Ichki loyihalarga
"private": trueyozing.
Keyingi bo'limda fayllar bilan ishlashni o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.