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.

🕑 12 daqiqa o‘qish 📄 877 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Paket o'rnatish
  2. Ikki xil bog'liqlik
  3. Semver - versiya raqamlari
  4. package-lock.json
  5. Yangilash
  6. npx
  7. Xavfsizlik
  8. Paket nomlari va ombor
  9. package.json ni o'qish
  10. Foydali maydonlar
  11. Xulosa

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 #

Terminal
npm install express
npm install --save-dev nodemon
npm install
BuyruqNima qiladi
npm install <nom>Paketni o'rnatib, dependencies ga yozadi
npm install -D <nom>devDependencies ga yozadi
npm installpackage.json dagi hammasini o'rnatadi
npm uninstall <nom>O'chiradi

O'rnatilgan paketni oddiy modul kabi ishlatasiz:

JavaScript
import express from "express";

console.log(typeof express);
console.log(typeof express().listen);
Natija
function
function

Ikki xil bog'liqlik #

JSON
{
  "type": "module",
  "dependencies": {
    "express": "^5.2.1"
  },
  "devDependencies": {
    "eslint": "^9.0.0"
  }
}
TuriNima uchunMisol
dependenciesDastur ishlashi uchun kerakexpress
devDependenciesFaqat ishlab chiqishda keraktestlar, linter

Serverga joylashda npm install --omit=dev deb yozsangiz, faqat birinchi guruh o'rnatiladi - natijada tasvir kichikroq va xavfsizroq bo'ladi.

Farqni to'g'ri tanlang

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.

5.2.1 raqami nimani bildiradi 5 . 2 . 1 MAJOR - katta eski kod buzilishi mumkin MINOR - yangilik qo'shildi, eskisi ishlaydi PATCH - tuzatish xato tuzatildi, xolos ^5.2.1 - 5.x.x gacha ruxsat ~5.2.1 - faqat 5.2.x gacha
JavaScript
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"));
Natija
true
true
false
false
true
false
false
Versiyalarni satr sifatida taqqoslamang

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.

YozuvRuxsat etadi
^5.2.15.2.1 dan 5.x.x gacha
~5.2.15.2.1 dan 5.2.x gacha
5.2.1Faqat aynan shu versiya
*Istalgan (ishlatmang)

npm install odatiy holda ^ qo'yadi.

package-lock.json #

^ bor bo'lsa, qanday qilib natija barqaror bo'ladi

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

Terminal
npm ci
BuyruqXatti-harakati
npm installpackage.json ga qarab, lock ni yangilashi mumkin
npm ciFaqat lock bo'yicha, aynan shunday o'rnatadi

npm ci serverlar va uzluksiz integratsiya uchun. U tezroq ham ishlaydi, chunki hisob-kitob qilmaydi.

Yangilash #

Terminal
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 #

Terminal
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 #

Terminal
npm audit
npm audit fix

npm audit bog'liqliklarda ma'lum zaifliklar bor-yo'qligini tekshiradi.

Har bir bog'liqlik - bu ishonch

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:

  1. Paket qo'shishdan oldin o'ylang. Uch qatorlik funksiya uchun bog'liqlik olish - yomon savdo.
  2. Standart kutubxonani tekshiring. Node da bugun juda ko'p narsa tayyor: fetch, test yurituvchi, .env o'qish, node:sqlite. Ilgari bularning har biri uchun paket kerak edi.
  3. Paketni tanlashda qarang: oxirgi yangilanish qachon, nechta ochiq muammo bor, nechta bog'liqligi bor.
  4. npm ci va package-lock.json ishlating - shunda kutilmagan versiya kelib qolmaydi.

Paket nomlari va ombor #

JavaScript
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"}`);
}
Natija
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 #

JavaScript
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"));
Natija
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 #

JSON
{
  "name": "mening-loyiham",
  "version": "1.0.0",
  "type": "module",
  "main": "index.js",
  "engines": {
    "node": ">=20"
  },
  "scripts": {
    "start": "node index.js"
  }
}
MaydonMa'nosi
name, versionPaketning kimligi
typemodule yoki commonjs
mainKirish nuqtasi
enginesQaysi Node versiyasi kerak
private: trueTasodifan nashr qilinmasin
private: true ni yozing

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.

Amaliy topshiriq
  1. npm install express bilan paket o'rnating.
  2. package.json da u qayerga yozilganini ko'ring.
  3. -D bilan ishlab chiqish bog'liqligini qo'shing.
  4. ^ va ~ farqini npm outdated bilan kuzating.
  5. package-lock.json ni ochib, ichidagini ko'ring.
  6. node_modules ni o'chirib, npm ci bilan tiklang.
  7. npx bilan biror vositani o'rnatmasdan ishlating.
  8. npm audit ni ishga tushiring.
  9. package.json ni dastur ichidan o'qib chiqaring.
  10. "private": true va engines maydonlarini qo'shing.

Xulosa #

  • dependencies - dastur ishlashi uchun; devDependencies - faqat ishlab chiqish uchun.
  • Semver: MAJOR.MINOR.PATCH; ^ katta raqamni, ~ esa o'rtani qulflaydi.
  • package-lock.json aniq versiyalarni saqlaydi va git ga qo'shiladi.
  • Serverda va CI da npm ci ishlating - u faqat lock bo'yicha o'rnatadi.
  • npx paketni 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": true yozing.

Keyingi bo'limda fayllar bilan ishlashni o'rganamiz.

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.