Aniq Node.js qo'llanmasi

Tasvir kreditlari: ajratish

Eslatma: ushbu qo'llanmaning PDF, ePub yoki Mobi versiyasini osonroq olish yoki Kindle yoki planshetingizda o'qish uchun olishingiz mumkin.

Mundarija

  • Node.js-ga kirish
  • Node.js-ning qisqacha tarixi
  • Node.js-ni qanday o'rnatish kerak
  • Node-dan foydalanish uchun qancha JavaScript bilish kerak?
  • Node va brauzer o'rtasidagi farqlar
  • V8 JavaScript mexanizmi
  • Node.js dasturidan qanday chiqish kerak
  • Node.js-dan atrof-muhit o'zgaruvchilarini qanday o'qish
  • Node.js ilovasini qayerda joylashtirish kerak
  • Node.js REPL-dan qanday foydalanish
  • Tugun, buyruq satridan dalillarni qabul qiling
  • Node buyruq satridan kirishni qabul qiling
  • Eksportdan foydalanib, tugun faylidan funktsional imkoniyatlarni oching
  • Npm ga kirish
  • Npm paketlarni qaerga o'rnatadi?
  • Npm-dan foydalanib o'rnatilgan paketni qanday ishlatish yoki bajarish kerak
  • Pack.json qo'llanmasi
  • Pack-lock.json fayli
  • Npm to'plamning o'rnatilgan versiyasini toping
  • Npm paketining eski versiyasini o'rnating
  • Barcha tugun bog'liqliklarini eng so'nggi versiyasiga yangilang
  • Npm-dan foydalanib semantik versiya
  • Npm paketlarini o'chirish
  • npm global yoki mahalliy paketlar
  • npm qaramlik va devDependentsiyalar
  • Npx tugun paketini ishga tushirish
  • Voqealar to'plami
  • Process.nextTick () ni tushunish
  • SetImmediate () ni tushunish
  • Taymerlar
  • Asenkron dasturlash va qo'ng'iroqlar
  • Va'dalar
  • Async va kuting
  • Node Event emitenti
  • HTTP so'rovlari qanday ishlaydi
  • HTTP protokoli
  • HTTP serverini yarating
  • Node bilan HTTP so'rovlarini bajarish
  • Axios-dan foydalanib, tugun ichida HTTP so'rovlari
  • Node.js-da WebSockets-dan foydalanish
  • Node-da fayl tavsiflovchilari bilan ishlash
  • Tugun fayllari statistikasi
  • Tugun fayl yo'llari
  • Node bilan fayllarni o'qish
  • Node bilan fayllarni yozish
  • Node-da papkalar bilan ishlash
  • Node fs moduli
  • Tugun yo'li moduli
  • Node os moduli
  • Node hodisalari moduli
  • Node http moduli
  • Node.js oqimlari
  • MySQL va Node bilan ishlash asoslari
  • Rivojlanish va ishlab chiqarish o'rtasidagi farq

Node.js-ga kirish

Ushbu qo'llanma Node.js uchun, qo'llaniladigan JavaScript ishlaydigan muhit uchun boshlang'ich qo'llanma.

Umumiy nuqtai

Node.js - bu serverda ishlaydigan JavaScript uchun ish vaqti muhiti.

Node.js ochiq manba bo'lib, o'zaro faoliyat platforma bo'lib, 2009 yilda paydo bo'lganidan beri u juda mashhur bo'lib kelmoqda va hozirda veb-taraqqiyot sahnasida muhim rol o'ynaydi. Agar GitHub yulduzlari mashhurlikni ko'rsatuvchi bitta omil bo'lsa, 58000+ yulduzlarga ega bo'lish bu juda mashhurlikni anglatadi.

Node.js brauzerdan tashqari Google Chrome-ning yadrosi bo'lgan V8 JavaScript motorini ishlaydi. Node.js brauzerning tez ishlashini yoqib yuborgan (va davom ettiradigan) muhandislarning ishlaridan foydalanishga qodir va bu Node.js-ga ulkan yaxshilanishlardan va Just-in-time kompilyatsiyasidan foyda olish imkonini beradi. V8 ijro etadi. Buning yordamida Node.js-da ishlaydigan JavaScript kodi juda faol bo'lishi mumkin.

Node.js ilovasi har bir so'rov uchun yangi mavzu yaratmasdan, bitta jarayon orqali boshqariladi. Node o'zining standart kutubxonasida asinxron I / O ibtidoiy vositalarini to'plamini taqdim etadi, bu JavaScript kodining bloklanishini oldini oladi va Node.js kutubxonalari bloksiz paradigma yordamida yozilgan bo'lib, blokirovka xatti-harakatlarini odatdagidan ko'ra istisno qiladi.

Node.js kirish / chiqish operatsiyasini bajarishi kerak, masalan, tarmoqdan o'qish, ma'lumotlar bazasiga kirish yoki fayl tizimiga kirish, Node.js ipni blokirovka qilish o'rniga protsessor tsikllarini bekor qilish o'rniga, javob qaytarilganda operatsiyalarni davom ettiradi. .

Bu Node.js-ga xatolarning asosiy manbai bo'lishi mumkin bo'lgan oqimlarni parallel ravishda boshqarish yukini kiritmasdan bitta server bilan minglab parallel ulanishlarni amalga oshirishga imkon beradi.

Node.js noyob afzalligiga ega, chunki brauzer uchun JavaScript-ni yozadigan millionlab oldingi ishlab chiquvchilar butunlay boshqa tilni o'rganishga hojat qoldirmasdan server va old tomon kodlarini ishlatishlari mumkin.

Node.js-da yangi ECMAScript standartlaridan muammosiz foydalanish mumkin, chunki barcha foydalanuvchilar o'zlarining brauzerlarini yangilashlarini kutishlari shart emas - siz Node.js versiyasini o'zgartirib, qaysi ECMAScript versiyasini ishlatishni hal qilishingiz kerak, va siz shuningdek tugunlarni bayroqlar bilan ishga tushirish orqali ma'lum tajribaviy xususiyatlarni yoqishingiz mumkin.

U juda ko'p kutubxonaga ega

O'zining oddiy tuzilishi bilan tugun paketi menejeri (npm) Node.js ekotizimining ko'payishiga yordam berdi. Endi npm registrida siz bemalol foydalanishingiz mumkin bo'lgan deyarli 500,000 ochiq manbali paketlar mavjud.

Node.js dasturining namunasi

Node.js Hello World-ning eng keng tarqalgan namunasi bu veb-server:

const http = zarur ('http')
const hostname = '127.0.0.1'
const porti = 3000
const server = http.createServer ((req, res) => {
  res.statusCode = 200
  res.setHeader ('Tarkib turi', 'matn / tekis')
  res.end ('Salom Dunyo \ n')
})
server.listen (port, xost nomi, () => {
  console.log (`Server http: // $ {hostname}: $ {port} /` da ishlamoqda)
})

Ushbu parchani ishlatish uchun uni server.js fayli sifatida saqlang va terminalda server.js tugunini ishga tushiring.

Ushbu kod avval Node.js http modulini o'z ichiga oladi.

Node.js ajoyib standart kutubxonaga ega, shu jumladan birinchi darajali tarmoqni qo'llab-quvvatlash.

Http-ning createServer () usuli yangi HTTP serverini yaratadi va uni qaytaradi.

Server belgilangan port va xost nomini tinglash uchun sozlangan. Server tayyor bo'lganda, qo'ng'iroqni qaytarish funktsiyasi chaqiriladi, bu holda server ishlayotganligi haqida xabar beradi.

Har safar yangi so'rov kelib tushganda, so'rov voqeasi chaqiriladi va ikkita ob'ekt taqdim etiladi: so'rov (http.IncomingMessageobject) va javob (http.ServerResponseobject).

Ushbu 2 ob'ekt HTTP qo'ng'iroqlarini boshqarish uchun zarurdir.

Birinchisi so'rov tafsilotlarini beradi. Ushbu oddiy misolda bu ishlatilmaydi, ammo siz so'rov sarlavhalari va so'rov ma'lumotlariga kirishingiz mumkin.

Ikkinchisi ma'lumotni qo'ng'iroq qiluvchiga qaytarishda ishlatiladi.

Bunday holda:

res.statusCode = 200

Biz muvaffaqiyatli javobni ko'rsatish uchun statusCode xususiyatini 200 ga o'rnatdik.

Kontent turi sarlavhasini o'rnatdik:

res.setHeader ('Tarkib turi', 'matn / tekis')

... va biz javobni yakunlaymiz va tarkibni tugatish uchun argument sifatida qo'shamiz ():

res.end ('Salom Dunyo \ n')

Node.js asoslari va vositalari

Node.js - bu past darajadagi platforma. Ishlab chiquvchilar uchun ishlarni osonroq va qiziqarli qilish uchun Node.js ustiga minglab kutubxonalar qurilgan.

Vaqt o'tishi bilan ko'pchilik mashhur variant sifatida tanilgan. Bu erda men juda muhim deb bilgan va o'rganishga loyiq bo'lganlarning to'liq ro'yxati yo'q:

  • Ekspress
     Veb-server yaratishning eng oddiy, ammo kuchli usullaridan biri. Uning minimalist yondoshuvi va serverning asosiy xususiyatlariga yo'naltirilmagan diqqat markazida bo'lish uning kalitidir.
  • Meteor
    Sizga JavaScript bilan dasturlarni yaratish va mijoz va serverda kod almashish uchun izomorfik yondashuv bilan ta'minlaydigan nihoyatda kuchli to'liq stack. Bir vaqtlar hamma narsani taqdim etadigan, hozirda u react, Vue va Angular kabi kutubxonalar bilan birlashadi. Meteor-dan mobil ilovalarni yaratishda ham foydalanish mumkin.
  • Koa
    Ekspressning orqasida bir xil jamoa tomonidan qurilgan Koa, yillar davomida eng ilg'or tajribaga tayanib, yanada sodda va kichikroq bo'lishga intiladi. Yangi loyiha mavjud jamoani buzmasdan mos kelmaydigan o'zgarishlarni yaratish zaruriyatidan kelib chiqqan.
  • Next.js
    Bu server tomonidan taqdim etilgan React dasturlarini ko'rsatish uchun asosdir.
  • Mikro
    Bu astenkron HTTP mikroservislarini yaratish uchun juda engil server.
  • Socket.io
    Bu real vaqt rejimida tarmoq ilovalarini yaratish uchun aloqa vositasi.

Node.js-ning qisqacha tarixi

Node.js tarixiga 2009 yildan hozirgi kunga nazar tashlaymiz

Ishoning yoki ishonmang, Node.js atigi 9 yoshda.

Taqqoslash uchun, JavaScript 23 yoshda va biz bilganimizday Internet (Musaik joriy etilgandan keyin) 25 yoshda.

9 yil bu texnologiya uchun oz vaqt, ammo Node.js abadiy bo'lganga o'xshaydi.

Men Node.js bilan ishlashni dastlabki kunlaridanoq, u endigina 2 yoshda bo'lganidan juda mamnun edim, va ozgina ma'lumotga ega bo'lishingizga qaramay, siz bu juda katta narsa ekanligini his qilishingiz mumkin edi.

Ushbu bo'limda men o'z tariximdagi Node.js-ning katta rasmini jalb qilmoqchiman, narsalarga nuqtai nazar bilan qarashni xohlayman.

Bir oz tarix

JavaScript bu Netscape-da veb-sahifalarni brauzeringiz Netscape Navigator-da boshqarish uchun skript vositasi sifatida yaratilgan dasturlash tili.

Netscape biznes modelining bir qismi "Netscape LiveWire" deb nomlangan muhitni o'z ichiga olgan Web-serverlarni sotish edi, bu esa JavaScript-ni ishlatib dinamik sahifalarni yaratishi mumkin edi. Shunday qilib, server tomonidagi JavaScript g'oyasi Node.js tomonidan kiritilmagan, bu xuddi JavaScript singari eski - ammo o'sha paytda u muvaffaqiyatsiz bo'lgan.

Node.js-ning paydo bo'lishiga olib keladigan omillardan biri bu vaqtni hisoblash edi. Bir necha yil oldin JavaScript-ni jiddiy til deb hisoblash boshlandi, chunki Internetda zamonaviy tajriba qanday bo'lishi mumkinligini ko'rsatgan ("Google Xaritalar" yoki "GMail" deb o'ylang) "Web 2.0" ilovalari uchun rahmat.

JavaScript dvigatellarining ishlash ko'rsatkichlari brauzerlar o'rtasidagi raqobat tufayli sezilarli darajada ko'tarildi. Har bir yirik brauzer ortida ishlaydigan jamoalar har kuni bizni yanada yaxshi ishlashimiz uchun astoydil harakat qilmoqdalar, bu JavaScript uchun platforma sifatida katta yutuqdir. Node.js kaput ostida ishlatiladigan Chrome V8, ana shunday vositalardan biri, xususan, bu Chrome JavaScript motoridir.

Ammo, albatta, Node.js shunchaki omad yoki vaqt tufayli mashhur emas. Bu serverda JavaScript-ni qanday dasturlash haqida juda ko'p innovatsion fikrlarni keltirib chiqardi.

2009 yil

Node.js tug'ilgan

Npm ning birinchi shakli yaratiladi

2010 yil

Express tug'iladi

Socket.io tug'ilgan

2011 yil

npm 1.0 ni urdi

Katta kompaniyalar tugunni qabul qilishni boshlaydilar: LinkedIn, Uber

Hapi tug'iladi

2012 yil

Qabul juda tez davom etmoqda

2013 yil

Node.js-dan foydalanadigan birinchi katta bloglash platformasi: Ghost

Koa tug'iladi

2014 yil

Katta drama: IO.js - bu Node.js-ning asosiy vilkasi, ES6-ni qo'llab-quvvatlash va tezroq harakat qilish maqsadi.

2015 yil

Node.js Jamg'armasi tug'ilgan

IO.js yana Node.js-ga birlashtirildi

npm shaxsiy modullarni taqdim etadi

4-tugun (oldin 1, 2, 3-versiyalari chiqarilmagan)

2016 yil

Chap panelda sodir bo'lgan voqea

Iplar tug'iladi: 6-tugun

2017 yil

npm xavfsizlikka ko'proq e'tibor qaratadi: 8-tugun

HTTP / 2

V8 Node-ni o'zining sinov to'plamida taqdim etadi va rasmiy ravishda Node-ni JavaScript vositasi uchun maqsadli qilib qo'yadi

Har hafta 3 milliard npm yuklash

2018 yil

10-tugun

ES modullari.

mjs eksperimental yordam

Node.js-ni qanday o'rnatish kerak

Node.js-ni tizimingizga qanday o'rnatishingiz mumkin: paket menejeri, rasmiy veb-sayt o'rnatuvchisi yoki nvm

Node.js-ni turli yo'llar bilan o'rnatish mumkin. Ushbu postda eng ko'p uchraydigan va qulay xabarlar keltirilgan.

Barcha asosiy platformalar uchun rasmiy paketlarni bu erda topish mumkin.

Node.js-ni o'rnatishning juda qulay usullaridan biri paket menejeri orqali. Bunday holda, har bir operatsion tizim o'z xususiyatlariga ega.

MacOS-da Homebrew-de-fakto standartdir va bir marta o'rnatilgandan keyin CLI-da ushbu buyruqni ishga tushirib, Node.js-ni juda oson o'rnatishga imkon beradi:

demlemek o'rnatish tugun

Linux va Windows uchun boshqa paket menejerlari bu erda keltirilgan.

nvm Node.js-ni ishlatishning mashhur usuli. Bu sizga Node.js versiyasini osongina almashtirishga va yangi versiyalarni o'rnatishga imkon beradi, masalan, agar biror narsa buzilsa, osonlikcha orqaga qaytish.

Kodni eski Node.js versiyalari bilan sinab ko'rish juda foydali.

Mening taklifim - agar siz endigina boshlayotgan bo'lsangiz va Homebrew-dan foydalanmasangiz, rasmiy o'rnatuvchidan foydalanish. Aks holda, Homebrew - bu mening eng sevimli echimim.

Node.js-dan foydalanish uchun qancha JavaScript bilish kerak?

Agar siz faqat JavaScript-ni boshlayotgan bo'lsangiz, tilni qanchalik chuqur bilish kerak?

Yangi boshlanuvchi sifatida dasturlash qobiliyatiga etarlicha ishonadigan joyga borish qiyin.

Kodlashni o'rganayotganda, shuningdek, JavaScript tugagan joydan va Node.js qaerdan boshlanishiga, va aksincha, chalkashib ketishingiz mumkin.

Sizga Node.js-ga kirishdan oldin asosiy JavaScript tushunchalarini yaxshi tushunishingizni maslahat beraman:

  • Leksik tuzilish
  • Ifodalar
  • Turlari
  • O'zgaruvchilar
  • Vazifalari
  • bu
  • Okning vazifalari
  • Looplar
  • Ko'chadan va ko'lami
  • Massivlar
  • Andoza adabiyotlar
  • Nuqtalar
  • Qattiq rejim
  • ECMAScript 6, 2016, 2017 yil

Ushbu tushunchalarni yodda tutgan holda, siz ham brauzerda, ham Node.js-da JavaScript-ning mohir dasturchisiga aylanishga tayyormiz.

Node.js-ning asosiy qismlaridan biri bo'lgan asenkron dasturlashni tushunish uchun quyidagi tushunchalar ham muhimdir:

  • Asenkron dasturlash va qo'ng'iroqlar
  • Taymerlar
  • Va'dalar
  • Async va kuting
  • Yopiqlar
  • Voqealar to'plami

Baxtimizga, men ushbu mavzularni tushuntirib beradigan bepul elektron kitob yozdim va u "JavaScript asoslari" deb nomlandi. Bularning barchasini o'rganish uchun topishingiz mumkin bo'lgan eng ixcham manba.

Node.js va brauzer o'rtasidagi farqlar

Node.js-da JavaScript dasturini qanday yozish brauzer ichidagi Internet uchun dasturlashdan farq qiladi.

Brauzer va Node JavaScript-ni o'zlarining dasturlash tili sifatida ishlatadilar.

Brauzerda ishlaydigan ilovalarni yaratish - bu Node.js dasturini yaratishdan mutlaqo boshqa narsa.

Har doim JavaScript bo'lishiga qaramay, ba'zi muhim farqlar mavjud bo'lib, ular tajribani tubdan farq qiladi.

Node.js ilovalarini yozadigan old tomondan ishlab chiquvchi katta afzalliklarga ega - til hali ham bir xil.

Sizda juda katta imkoniyat bor, chunki biz dasturlash tilini to'liq, chuqur o'rganish qanchalik qiyinligini bilamiz. O'zingizning barcha ishlaringizni Internetda ham, mijozda ham, serverda ham bajarish uchun bir xil tildan foydalangan holda siz noyob ustunlikka egasiz.

Qanday o'zgarishlar ekotizim.

Brauzerda ko'pincha DOM yoki cookie fayllari kabi boshqa veb-platforma interfeyslari bilan ish olib borasiz. Albatta, ular Node.js-da mavjud emas. Sizda brauzer tomonidan taqdim etilgan hujjat, oyna va boshqa narsalar yo'q.

Va brauzerda bizda Node.js modullari orqali taqdim etiladigan yoqimli API-lar yo'q, masalan fayl tizimiga kirish funktsiyalari.

Yana bir katta farq shundaki, Node.js-da siz atrof-muhitni boshqarasiz. Agar siz biron bir odam istagan joyda foydalanishi mumkin bo'lgan ochiq manbali dasturni yaratmasangiz, Node.js-ning qaysi versiyasini ishga tushirishni bilasiz. Brauzer muhiti bilan taqqoslaganda, sizning tashrif buyuruvchilaringiz qaysi brauzerni tanlashi uchun hashamatli bo'lolmaysiz, bu juda qulaydir.

Bu sizning Node versiyangiz qo'llab-quvvatlaydigan barcha zamonaviy ES6–7–8–9 JavaScript-ni yozishingiz mumkinligini anglatadi.

JavaScript juda tez harakat qilar ekan, lekin brauzerlar biroz sekinlashishi mumkin va foydalanuvchilar biroz yangilanishi mumkin - ba'zan Internetda siz eski JavaScript / ECMAScript versiyalaridan foydalanishda qiynalasiz.

Babel-dan brauzerga yuborishdan oldin kodingizni ES5-ga mos keladigan qilib o'zgartirishingiz mumkin, ammo Node.js-da bu sizga kerak bo'lmaydi.

Yana bir farq shundaki, Node.js CommonJS modul tizimidan foydalanadi, brauzerda esa ES Modullar standarti amalga oshirilayotganini ko'ramiz.

Amalda, bu shuni anglatadiki, siz foydalanayotgan vaqtingizda Node.js-da () brauzerda talab qilinadi va import qilinadi.

V8 JavaScript mexanizmi

V8 - bu Google Chrome-ni quvvatlaydigan JavaScript motorining nomi. Bu bizning JavaScript-ni oladi va uni Chrome-da ko'rib chiqishda bajaradi.

V8 JavaScript ishlaydigan ish vaqti muhiti bilan ta'minlaydi. DOM va boshqa Web Platform API-lar brauzer tomonidan ta'minlanadi.

Achinarlisi shundaki, JavaScript mexanizmi o'zi joylashgan brauzer tomonidan mustaqil bo'ladi. Ushbu asosiy xususiyat Node.js-ni ko'paytirishga imkon berdi. V8 2009 yilda Node.js tomonidan tanlangan dvigatel bo'lish uchun tanlangan va Node.jsning mashhurligi oshib borishi sababli, V8 hozirda JavaScript-da yozilgan juda ko'p miqdordagi server tomon kodlarini ishlab chiqaradigan dvigatelga aylandi.

Node.js ekotizimi juda katta va uning sharofati bilan V8 shuningdek, Electron kabi loyihalar bilan ish stoli ilovalarini ham quvvatlaydi.

Boshqa JS dvigatellari

Boshqa brauzerlarda o'zlarining JavaScript mexanizmi mavjud:

  • Firefox-da Spidermonkey mavjud
  • Safari-da JavaScriptCore (Nitro deb ham ataladi) mavjud.
  • Yonida Chakra bor

va boshqalar ham mavjud.

Ushbu barcha dvigatellar ECMA ES-262 standartini, shuningdek, JavaScript tomonidan ishlatiladigan ECMAScript deb nomlangan standartni amalga oshiradilar.

Ishlash uchun qidiruv

V8 C ++ tilida yozilgan va u doimiy ravishda takomillashtirib boriladi. U ko'chma va Mac, Windows, Linux va boshqa tizimlarda ishlaydi.

Ushbu V8 kirishda men V8-ni amalga oshirish tafsilotlarini e'tiborsiz qoldiraman. Ularni ko'proq obro'li saytlarda, shu jumladan V8 rasmiy saytida topish mumkin va ular vaqt o'tishi bilan, ko'pincha tubdan o'zgarib turadi.

V8 Internet va Node.js ekotizimini tezlashtirish uchun har doim boshqa JavaScript motorlari singari rivojlanib bormoqda.

Internetda ishlash uchun bir necha yillardan beri davom etayotgan poyga bor va biz (foydalanuvchilar va ishlab chiquvchilar sifatida) ushbu musobaqadan ko'p foyda olamiz, chunki biz yildan-yilga tez va optimallashtirilgan mashinalarni olamiz.

Jamlama

JavaScript odatda talqin qilingan til hisoblanadi, ammo zamonaviy JavaScript motorlari endi shunchaki JavaScript-ni sharhlamaydilar, balki uni yaratadilar.

Bu 2009 yildan beri SpiderMonkey JavaScript kompilyatori Firefox 3.5-ga qo'shilganidan keyin sodir bo'ldi va hamma bu fikrga ergashdi.

Ijroni tezlashtirish uchun JavScript ichki V8 tomonidan bir vaqtning o'zida (JIT) kompilyatsiya bilan tuzilgan.

Bu qarshi ko'rsatmalarga o'xshab ko'rinishi mumkin. Ammo 2004 yilda Google Xaritalar paydo bo'lganidan beri JavaScript brauzerda minglab va yuz minglab satrlar bilan dasturlarni to'ldirish uchun bir necha o'nlab kod satrlarini bajaradigan tildan rivojlandi.

Endilikda bizning amaliy dasturlarimiz bir necha shakllarni tekshirish qoidalari yoki oddiy skriptlardan ko'ra brauzer ichida bir necha soat ishlashi mumkin.

Ushbu yangi dunyoda, JavaScript-ni tuzish juda yaxshi ma'noga ega, chunki JavaScript-ni tayyorlash uchun biroz ko'proq vaqt talab etilishi mumkin, ammo bu to'liq talqin qilingan kodni bajarishga imkon beradi.

Node.js dasturidan qanday chiqish kerak

Node.js dasturini tugatishning turli usullari mavjud.

Konsolda dasturni ishga tushirganda siz uni ctrl-C bilan yopishingiz mumkin, ammo men bu erda muhokama qilmoqchi bo'lgan narsa dasturiy jihatdan chiqib ketmoqda.

Keling, eng keskinlardan boshlaylik va nima uchun uni ishlatmaslik yaxshiroq ekanligingizni bilib oling.

Jarayon yadro moduli sizga Node.js dasturidan dasturiy ravishda chiqish imkonini beradigan qulay usulni taqdim etadi: process.exit ().

Node.js ushbu chiziqni ishlaganda, jarayon darhol to'xtatiladi.

Bu shuni anglatadiki, har qanday qo'ng'iroqni qayta tiklash, kutilayotgan har qanday tarmoq so'rovi, hanuzgacha fayl tizimiga kirish, yoki stdout yoki stderr-ga yozish jarayoni - barchasi darhol bexosdan tugatiladi.

Agar bu siz uchun yaxshi bo'lsa, siz operatsion tizimning chiqish kodini bildiradigan butun sonni o'tkazishingiz mumkin:

process.exit (1)

Odatiy bo'lib chiqish kodi 0 bo'lib, bu muvaffaqiyat deganidir. Turli xil chiqish kodlari har xil ma'noga ega bo'lib, siz ularni o'z tizimingizda dasturni boshqa dasturlar bilan bog'lanishini xohlaysiz.

Chiqish kodlari haqida ko'proq ma'lumotni bu erda o'qishingiz mumkin.

Siz shuningdek process.exitCode xususiyatini o'rnatishingiz mumkin:

process.exitCode = 1

va dastur keyinroq tugashi bilan Node.js ushbu chiqish kodini qaytaradi.

Dastur barcha ishlov berish tugagach, chiqadi.

Node.js bilan ko'p marotaba ushbu HTTP serveri kabi serverlarni ishga tushiramiz:

const express = zarur ('express')
const app = express ()
app.get ('/', (req, res) => {
  res.send ('Salom!')
})
app.listen (3000, () => console.log ('Server tayyor'))

Ushbu dastur hech qachon tugamaydi. Agar siz process.exit () -ga qo'ng'iroq qilsangiz, hozirda kutilayotgan yoki ishlayotgan har qanday so'rov bekor qilinadi. Bu yaxshi emas.

Bu holda siz SIGTERM signalini yuborishingiz kerak va buni signalni qayta ishlov beruvchi bilan ishlating:

Eslatma: jarayon talab qilinmaydi, u avtomatik ravishda mavjud.

const express = zarur ('express')
const app = express ()
app.get ('/', (req, res) => {
  res.send ('Salom!')
})
app.listen (3000, () => console.log ('Server tayyor'))
process.on ('SIGTERM', () => {
  app.close (() => {
    console.log ('Jarayon to'xtatildi')
  })
})

Signallar nima? Signallar portativ operatsion tizim interfeysi (POSIX) aloqa tizimidir: bu jarayon haqida uni xabardor qilish uchun bildirishnoma yuboriladi.

SIGKILL - bu jarayonni darhol to'xtatilishini bildiradigan va ideal ravishda process.exit () kabi ish tutadigan signallar.

SIGTERM - bu jarayonni tugatish haqida ogohlantiruvchi signallar. Bu yuqoridagi yoki boshliq kabi ko'plab boshqa menejerlar tomonidan yuboriladigan signal.

Siz ushbu signalni dasturning ichidan boshqa funktsiyada yuborishingiz mumkin:

process.kill (process.pid, 'SIGTERM')

Yoki boshqa Node.js ishlaydigan dasturidan yoki tizimingizda ishlamayotgan siz tugatmoqchi bo'lgan PID PID-ni biladigan biron bir dasturdan.

Node.js-dan atrof-muhit o'zgaruvchilarini qanday o'qish

Node protsessual yadro moduli ushbu jarayon boshlanganda o'rnatilgan barcha atrof-muhit o'zgaruvchilarini o'z ichiga olgan envproperty bilan ta'minlaydi.

Odatdagidek rivojlanish uchun o'rnatilgan NODE_ENV atrof-muhit o'zgaruvchisiga kirish uchun misol.

process.env.NODE_ENV // "rivojlanish"

Skriptni ishga tushirishdan oldin uni ishlab chiqarishga o'rnatish Node.js-ga bu ishlab chiqarish muhiti ekanligini aytadi.

Xuddi shu tarzda siz o'rnatgan istalgan maxsus muhit o'zgaruvchisiga kirishingiz mumkin.

Node.js ilovasini qayerda joylashtirish kerak

Node.js dasturi sizning ehtiyojlaringizga qarab ko'p joylarda joylashtirilishi mumkin.

Ilovangizni o'rnatmoqchi va uni hammaga ochiq qilishni xohlaganingizda o'rganishingiz mumkin bo'lgan variantlarning to'liq ro'yxati.

Men eng sodda va cheklangandan murakkabroq va kuchliroq variantlarni sanab o'taman.

Eng oddiy variant: mahalliy tunnel

Agar sizda dinamik IP bo'lsa yoki siz NAT-ga ega bo'lsangiz ham, mahalliy tunnel yordamida o'zingizning ilovangizni o'rnatishingiz va so'rovlaringizni to'g'ridan-to'g'ri kompyuteringizdan bajarishingiz mumkin.

Ushbu parametr ba'zi bir tezkor sinov, mahsulotni namoyish qilish yoki juda kichik odamlar guruhi bilan ilovani almashish uchun mos keladi.

Buning uchun barcha platformalarda mavjud bo'lgan juda yaxshi vosita ngrok.

Undan foydalanib, siz faqat ngrok PORT ni terishingiz mumkin va siz xohlagan PORT internetga ulanadi. Siz ngrok.io domeniga ega bo'lasiz, ammo pullik obuna bilan siz maxsus URL-ni, shuningdek, xavfsizlikning qo'shimcha parametrlarini olishingiz mumkin (mashinangizni ommaviy Internetga ochayotganingizni unutmang).

Siz foydalanishingiz mumkin bo'lgan yana bir xizmat - bu mahalliy tarmoq.

Nolinchi konfiguratsiyani joylashtirish

Glitch

Glitch - bu o'yin maydonchasi va ilovalaringizni har qachongidan ham tezroq yaratish va ularni o'zlarining glitch.com subdomainida jonli ko'rish. Siz hozirda maxsus domenga ega bo'lolmaysiz va bir nechta cheklovlar mavjud, ammo prototip uchun juda yaxshi. Bu juda qiziqarli ko'rinadi (va bu ortiqcha) va bu soqov bo'lmagan muhit emas - siz Node.js-ning barcha imkoniyatlarini, CDN-ni, hisobga olish ma'lumotlarini xavfsiz saqlashni, GitHub-ni import / eksportni va boshqalarni olasiz.

FogBugz va Trello orqasida kompaniya tomonidan taqdim etilgan (va Stack Overflow-ning hammualliflari).

Men uni demo maqsadlarida juda ko'p ishlataman.

Kodepen

Codepen - bu ajoyib platforma va jamoa. Siz bir nechta fayllardan iborat loyihani yaratishingiz va uni maxsus domen bilan joylashtirishingiz mumkin.

Serversiz

Ilovalaringizni nashr qilishning va umuman boshqarish uchun hech qanday serverga ega bo'lmagan usul serversizdir. Serverless bu sizning ilovalaringizni funktsiyalar sifatida nashr etadigan paradigma bo'lib, ular tarmoqning so'nggi nuqtasida javob beradi (shuningdek, FAAS - Xizmat sifatida xizmat qiladi).

Juda mashhur echimlar:

  • Serversiz tizim
  • Standart kutubxona

Ikkalasi ham Azure yoki Google Cloud taklifiga asoslangan AWS Lambda va boshqa FAAS echimlarida nashr etish uchun mavhum qavatni ta'minlaydi.

PAAS

PAAS bu platforma sifatida xizmat qiladi. Ushbu platformalar juda ko'p narsalarni olib tashlaydi, aks holda siz ilovangizni o'rnatishda xavotirga tushishingiz kerak.

Zeit Now

Zeit - bu qiziqarli variant. Siz hozir terminalingizga kirasiz va bu sizning arizangizni o'rnatishda juda muhimdir. Cheklovlar mavjud bepul versiyasi va pullik versiyasi yanada kuchliroq. Siz shunchaki server mavjudligini unutasiz, shunchaki dasturni joylashtirasiz.

Nanoboks

Nanoboks

Heroku

Heroku ajoyib platforma.

Bu Heroku-da Node.js-ni ishga tushirish haqida ajoyib maqola.

Microsoft Azure

Azure - Microsoft Cloud taklifidir.

Azure-da Node.js veb-dasturini qanday yaratishni tekshiring.

Google Cloud platformasi

Google Cloud - bu sizning ilovalaringiz uchun ajoyib tuzilma.

Ular yaxshi Node.js Hujjatlar bo'limiga ega.

Virtual xususiy server

Ushbu bo'limda siz odatdagidan shubhali odamlarni topasiz, ular kamroq foydalanuvchilarga osonroq buyurtma qilish uchun buyurtma qilingan:

  • Raqamli Okean
  • Linode
  • Amazon Web Services, xususan, Amazon Elastik Beanstalkni eslataman, chunki u AWS murakkabligini biroz kamaytiradi.

Ular siz bo'sh ishlashi mumkin bo'lgan bo'sh Linux mashinasi bilan ta'minlanganligi sababli, ular uchun maxsus qo'llanma mavjud emas.

VPS toifasida ko'proq imkoniyatlar mavjud, ular men ishlatgan variantlar va men tavsiya qilaman.

Yalang'och metall

Boshqa yechim - yalang'och metall serverni olish, Linux distributivini o'rnatish, uni Internetga ulash (yoki Vultr Bare Metal xizmatidan foydalanganingiz kabi oyiga bitta ijaraga olish).

Node.js REPL-dan qanday foydalanish

REPL Read-Evaluate-Print-Loop ma'nosini anglatadi va bu Node.js xususiyatlarini tezkorlik bilan o'rganishning ajoyib usuli.

"Node" buyrug'i bizning Node.js skriptlarimizni ishga tushirishda foydalanadigan buyruq:

tugun script.js

Agar biz fayl nomini tashlab qo'ysak, uni REPL rejimida ishlatamiz:

tugun

Agar siz hozir uni terminalingizda sinab ko'rsangiz, quyidagilar sodir bo'ladi:

❯ tugun
>

buyruq harakatsiz rejimda qoladi va bizdan biron bir narsani kiritishimizni kutadi.

Maslahat: agar siz terminalni qanday ochishni bilmasangiz, Google "

REPL bizdan bir nechta JavaScript kodini kiritishni kutmoqda.

Oddiy boshlang va kiriting:

> console.log ('sinov')
sinov
aniqlanmagan
>

Birinchi qiymat, sinov, biz konsolga chop etishni aytgan natija, keyin biz aniqlanmagan konsol.log () ni ishga tushirish qiymati bo'ladi.

Endi JavaScript-ning yangi satrini kiritishimiz mumkin.

Avtomatik to'ldirish uchun yorliqdan foydalaning

REPLning yoqimli jihati shundaki, u interaktivdir.

Kodni yozishda, agar siz yorliq tugmachasini bosgan bo'lsangiz, REPL siz allaqachon aniqlagan o'zgaruvchiga yoki oldindan belgilangan parametrga mos kelish uchun yozganingizni avtoto'ldirishga harakat qiladi.

JavaScript ob'ektlarini o'rganish

JavaScript kabi sinf nomini kiritib ko'ring, masalan, nuqta qo'shing va yorliqni bosing.

REPL ushbu sinfda kirishingiz mumkin bo'lgan barcha xususiyatlar va usullarni chop etadi:

Global ob'ektlarni o'rganing

Siz global yozishingiz orqali siz kirishingiz mumkin bo'lgan globallarni tekshirishingiz mumkin. va yorliqni bosish:

_ Maxsus o'zgaruvchi

Agar biron-bir koddan keyin siz _ ni tersangiz, bu oxirgi operatsiya natijasini chiqaradi.

Nuqta buyruqlari

REPL ba'zi bir maxsus buyruqlarga ega, ularning hammasi nuqta bilan boshlangan .. Ular

  • .help: nuqta buyruqlari yordamini ko'rsatadi
  • .editor: muharrirga ko'p darajali JavaScript kodini osonlikcha yozishga imkon beradi. Ushbu rejimda bo'lgandan so'ng, siz yozgan kodni ishga tushirish uchun ctrl-D kiriting.
  • .break: ko'p qatorli iborani kiritishda .break buyrug'ini kiritish keyingi kiritishni bekor qiladi. Ctrl-C tugmachalarini bosish bilan bir xil.
  • .clear: REPL kontekstini bo'sh ob'ektga qaytaradi va hozirgi paytda kiritilayotgan ko'p qatorli iboralarni tozalaydi.
  • .load: joriy ishchi katalogga nisbatan JavaScript faylini yuklaydi
  • .save: REPL seansida kiritgan barcha ma'lumotlaringizni faylga saqlaydi (fayl nomini ko'rsating)
  • .exit: javob mavjud (ctrl-C tugmasini ikki marta bosish bilan bir xil)

REPL .editor-ni chaqirmasdan ko'p qatorli bayonot yozayotganingizni biladi.

Masalan, agar siz iteratsiyani shunday yozishni boshlasangiz:

[1, 2, 3] .Har biri uchun (num => {

va Enter tugmachasini bosganingizda, REPL 3 nuqtadan boshlanadigan yangi qatorga o'tadi, endi siz ushbu blokda ishlashni davom ettirishingiz mumkinligini anglatadi.

... konsol.log (num)
...})

Agar satr oxirida .break yozsangiz, ko'p darajali rejim to'xtaydi va bayonot bajarilmaydi.

Node.js, buyruq satridan dalillarni qabul qiling

Qanday qilib buyruq qatoridan o'tgan Node.js dasturida argumentlarni qabul qilish

Node.js dasturini ishga tushirishda har qanday dalillar:

tugun app.js

Dalillar mustaqil bo'lishi mumkin yoki kalit va qiymatga ega bo'lishi mumkin.

Masalan:

tugun app.js flavio

yoki

tugun app.js nomi = flavio

Bu Node.js kodida ushbu qiymatni qanday olishingizni o'zgartiradi.

Uni olish usuli Node.js.-ga o'rnatilgan jarayon ob'ekti yordamida amalga oshiriladi.

Bu argv xususiyatini ochib beradi, bu esa buyruqlar satrini chaqiradigan barcha dalillarni o'z ichiga olgan massivdir.

Birinchi dalil tugun buyrug'ining to'liq yo'li.

Ikkinchi element - bajarilayotgan faylning to'liq yo'li.

Barcha qo'shimcha dalillar oldinga qo'yilgan uchinchi pozitsiyadan kelib chiqadi.

Siz barcha argumentlarni (tugun va fayl yo'lini qo'shgan holda) pastadir yordamida takrorlashingiz mumkin:

process.argv.forEach ((val, indeks) => {
  console.log (`$ {indeks}: $ {val}`)
})

Dastlabki 2 qatorni o'z ichiga olmaydigan yangi qator yaratish orqali siz faqat qo'shimcha dalillar olishingiz mumkin.

const args = process.argv.slice (2)

Agar siz indeks nomisiz bitta argumentga ega bo'lsangiz, quyidagicha:

tugun app.js flavio

undan foydalanib kirishingiz mumkin

const args = process.argv.slice (2)
args [0]

Ushbu holatda:

tugun app.js nomi = flavio

args [0] ismi = flavio, va uni tahlil qilish kerak. Buning eng yaxshi usuli - bu minimalist kutubxonadan foydalanish, bu esa argumentlarni hal qilishga yordam beradi:

const args = zarur ('minimist') (process.argv.slice (2))
args ['name'] // flavio

Node.js yordamida buyruq satriga chiqish

Node.js-dan foydalanib buyruqlar satri konsoliga, asosiy konsol.log-dan murakkabroq stsenariylarga qanday chop etish kerak.

Konsol moduli yordamida asosiy chiqish

Node.js buyruq satri bilan o'zaro ishlashning juda foydali usullarini taqdim etadigan konsol modulini taqdim etadi.

Bu asosan brauzerda topilgan konsol ob'ekti bilan bir xil.

Eng asosiy va eng ko'p ishlatiladigan usul bu konsol.log () bo'lib, u siz kiritgan satrni konsolga bosib chiqaradi.

Agar siz ob'ektni o'tkazsangiz, u uni mag'lubiyatga aylantiradi.

Siz bir nechta o'zgaruvchini konsol.log-ga o'tkazishingiz mumkin, masalan:

const x = 'x'
const y = 'y'
konsol.log (x, y)

va Node.js ikkalasini ham chop etadi.

O'zgaruvchilar va format spetsifikatorlarini o'tkazish orqali biz ham chiroyli iboralarni formatlashimiz mumkin.

Masalan:

console.log ('Mening% s vaqtim% d yil', 'mushuk', 2)
  • % s o'zgaruvchini satr sifatida formatlaydi
  • % d yoki% i o'zgaruvchini butun son sifatida formatlaydi
  • % f o'zgaruvchini o'zgaruvchan nuqta raqami sifatida formatlaydi
  • % O ob'ekt namoyishini chop etish uchun ishlatiladi

Masalan:

console.log ('% O', raqam)

Konsolni tozalang

console.clear () konsolni o'chiradi (muomala ishlatiladigan konsolga bog'liq bo'lishi mumkin)

Hisoblash elementlari

console.count () qulay usul.

Ushbu kodni oling:

const x = 1
const y = 2
const z = 3
konsol.count (
  'X ning qiymati' + x + 'va tekshirildi .. necha marta?'
)
konsol.count (
  'X ning qiymati' + x + 'va tekshirildi .. necha marta?'
)
konsol.count (
  'Y ning qiymati' + y + 'dir va necha marta tekshirilgan ..'
)

Nima sodir bo'ladi, shunda sanash satrning necha marta bosilishini hisoblaydi va uning yonida sanashni chop etadi.

Siz shunchaki olma va apelsinlarni sanashingiz mumkin:

const apelsinlar = ['to'q sariq', 'to'q sariq']
const appleles = ['bittadan olma']
apelsinlar.forEach (meva => {
  konsol.count (meva)
})
olma.forEach (meva => {
  konsol.count (meva)
})

Stack izini chop eting

Biror funktsiyaning qo'ng'iroq izini bosib chiqarish foydali bo'lgan holatlar bo'lishi mumkin, masalan: "Siz kodning qaysi qismiga etib oldingiz?"

Siz buni console.trace () yordamida qilishingiz mumkin:

const function2 = () => console.trace ()
const function1 = () => funktsiya2 ()
funktsiya1 ()

Bu stack izini bosib chiqaradi. Agar men ushbu tugunni REPL-da sinab ko'rsam, u chop etilgan:

Iz
    2-funktsiyada (javob: 1: 33)
    1-funktsiyada (javob: 1: 25)
    javob vaqtida: 1: 1
    ContextifyScript.Script.runInThisContext-da (vm.js: 44: 33)
    REPLServer.defaultEval-da (o'zgartirish: 239: 29)
    chegaralangan (domain.js: 301: 14)
    REPLServer.runBound-da [baholash sifatida] (domain.js: 314: 12)
    REPLServer.onLine-da (o'rnini bosuvchi: 440: 10)
    emitOne-da (voqealar.js: 120: 20)
    REPLServer.emit-da (voqealar.js: 210: 7)

Sarflangan vaqtni hisoblang

Vaqt () va timeEnd () dan foydalanib, funktsiyani bajarish uchun qancha vaqt ketishini osonlikcha hisoblashingiz mumkin.

const doSomething = () => console.log ('sinov')
const MeasDoingSomething = () => {
  konsol.time ('doSomething ()')
  // biror narsa qilish va vaqtni o'lchash
  nimadir qil()
  console.timeEnd ('doSomething ()')
}
o'lchovDoingSomething ()

stdout va stderr

Biz ko'rganimizdek console.log xabarlarni konsolda chop etish uchun juda qulaydir. Bu standart chiqish yoki stdout deb nomlangan narsa.

console.error stderr oqimiga bosib chiqaradi.

U konsolda ko'rinmaydi, lekin xatolar jurnalida paydo bo'ladi.

Chiqish rangini tanlang

Konsolda matnning chiqishini ketma-ketlikdan foydalanib rang berishingiz mumkin. Qochish ketma-ketligi rangni belgilaydigan belgilar to'plamidir.

Masalan:

console.log ('\ x1b [33m% s \ x1b [0m', 'salom!')

Siz buni "tugunni REPL" da sinab ko'rishingiz mumkin va u salom beradi! sariq rangda.

Biroq, buni amalga oshirishning past darajadagi usuli. Konsol chiqishini rang berishning eng oddiy usuli kutubxonadan foydalanishdir. Bo'r bunday kutubxona bo'lib, uni bo'yashdan tashqari, boshqa rang berish vositalariga ham yordam beradi, masalan, matnni qalin, kursiv yoki chiziqcha qilish.

Siz uni npm o'rnatish tegi bilan o'rnatasiz, undan foydalanishingiz mumkin:

const bo'r = zarur ('bo'r')
konsol.log (chalk.yellow ('salom!'))

Chalk.yellow-ni ishlatish qochish kodlarini eslab qolishdan ko'ra ancha qulayroq va kodni o'qish osonroq.

Ko'proq foydalanish misollari uchun yuqorida men e'lon qilgan loyiha havolasini tekshiring.

Jarayon satrini yarating

Progress - bu konsolda taraqqiyot satrini yaratish uchun ajoyib to'plam. Uni npm o'rnatish jarayoni yordamida o'rnating.

Ushbu parcha 10 bosqichli rivojlanish satrini yaratadi va har 100 ms bitta qadam bajariladi. Bar tugallangandan so'ng biz oraliqni tozalaymiz:

const ProgressBar = talab ('progress')
const bar = yangi ProgressBar (': bar', {jami: 10})
const taymer = setInterval (() => {
  bar.tick ()
  if (bar.complete) {
    clearInterval (taymer)
  }
}, 100)

Node.js buyruq satridan kirishni qabul qiling

Node.js CLI dasturini qanday interaktiv qilish kerak?

Node 7-versiyasidan boshlab Readline moduli aynan shu narsani amalga oshirishni ta'minlaydi: process.stdin oqimi kabi o'qiladigan oqimdan kirish, Node dasturini bajarish paytida bir martadan bitta satrdan iborat bo'lgan terminal kirishidir.

const readline = zarur ('readline'). createInterface ({
  kiritish: process.stdin,
  chiqish: process.stdout
})
readline.question (`Ismingiz nima? ', (ism) => {
  console.log (`Salom $ {name}! ')
  readline.close ()
})

Kodning ushbu qismi foydalanuvchi nomini so'raydi va matn kiritilib, foydalanuvchi bosilganda, biz tabriklaymiz.

Savol () usuli birinchi parametrni (savol) ko'rsatadi va foydalanuvchi kiritishini kutadi. Kirish tugmachasi bosilganda qo'ng'iroqni qaytarish funktsiyasi chaqiriladi.

Ushbu qo'ng'iroqni qaytarish funktsiyasida biz o'qish chizig'ining interfeysini yopamiz.

readline bir nechta boshqa usullarni taklif qiladi va sizga yuqorida bog'langan paket hujjatlari bilan tanishib chiqishga ruxsat beraman.

Agar parolni talab qilish kerak bo'lsa, uni endi qaytarish yaxshiroq, lekin * belgisini ko'rsatish kerak.

Oddiy usul - bu API jihatidan juda o'xshash va uni qutidan tashqariga chiqadigan readline-sync paketidan foydalanish.

Yanada to'liq va mavhum echim Inquirer.js to'plamida keltirilgan.

Siz uni npm install so'rovchisi yordamida o'rnatishingiz mumkin va keyin quyidagi kodni takrorlashingiz mumkin:

const inquirer = talab qilish ('surishtiruvchi')
var savollar = [{
  turi: 'kiritish',
  ism: 'ism',
  xabar: "Ismingiz nima?",
}]
savol beruvchi.prompt (savollar). so'ngra (javoblar => {
  console.log (`Salom $ {['nom']} javoblari! ')
})

Inquirer.js sizga ko'p tanlov qilishni so'rash, radio tugmachalari, tasdiqlash va boshqa ko'p narsalarni qilish imkonini beradi.

Barcha alternativalarni, ayniqsa Node.js tomonidan taqdim etilganlarni bilishga arziydi, lekin agar siz CLI-ni keyingi bosqichga o'tkazishni rejalashtirmoqchi bo'lsangiz, Inquirer.js - eng maqbul tanlov.

Eksportdan foydalanib, Node.js faylidan funktsional imkoniyatlarni oching

Ma'lumotni sizning ilovangizdagi yoki boshqa dasturlarda boshqa foydalanuvchilarga oshkor qilish uchun module.exports API-ni qanday ishlatish kerak

Node.js-da o'rnatilgan modul tizimi mavjud.

Node.js fayli boshqa Node.js fayllari ta'sir ko'rsatadigan funktsiyalarni import qilishi mumkin.

Siz ishlatadigan biror narsani import qilmoqchi bo'lsangiz:

const library = zarur ('./ kutubxona')

joriy fayl papkasida joylashgan Library.js faylida mavjud bo'lgan funktsional imkoniyatlarni import qilish.

Ushbu faylda boshqa fayllar tomonidan import qilinishidan oldin, uning funktsional imkoniyatlari oshkor bo'lishi kerak.

Sukut bo'yicha faylda aniqlangan har qanday boshqa ob'ekt yoki o'zgaruvchi shaxsiy va tashqi dunyoga ta'sir qilmaydi.

Bu modul tizimi tomonidan taqdim etilgan module.exports API tomonidan amalga oshiriladigan imkoniyat.

Agar ob'ektni yoki funktsiyani yangi eksport mulki sifatida tayinlasangiz, u ochib beriladi. Shunday qilib, uni ilovangizning boshqa qismlariga yoki boshqa ilovalarga import qilish mumkin.

Buni 2 usulda qilishingiz mumkin.

Birinchisi, ob'ektni modul tizimi tomonidan ta'minlanadigan modul.exports-ga tayinlash va bu sizning faylingizni shu ob'ektni eksport qilishiga olib keladi:

const car = {
  brend: 'Ford',
  model: 'Fiesta'
}
modul.exports = avtomobil
//..da boshqa faylda
const car = zarur ('./ car')

Ikkinchi usul - eksport qilinadigan ob'ektni eksport mulki sifatida qo'shish. Bu usul sizga bir nechta ob'ektlar, funktsiyalar yoki ma'lumotlarni eksport qilishga imkon beradi:

const car = {
  brend: 'Ford',
  model: 'Fiesta'
}
export.car = mashina

yoki to'g'ridan-to'g'ri

export.car = {
  brend: 'Ford',
  model: 'Fiesta'
}

Va boshqa faylda siz importingizning mulkiga murojaat qilib foydalanasiz:

const bandlari = talab ('./ items')
narsalar.car

yoki

const car = need ('./ items'). mashina

Modulning eksporti va eksporti o'rtasidagi farq nima?

Birinchisi u ko'rsatgan ob'ektni ochib beradi. Ikkinchisi u ko'rsatadigan ob'ektning xususiyatlarini ochib beradi.

Npm ga kirish

npm tugun paketi menejeri degan ma'noni anglatadi.

2017 yil yanvar oyida 350,000 dan ortiq paketlar npm registrida ro'yxatga olinganligi xabar qilindi, bu dunyodagi eng katta yagona yagona til kodi omboriga aylandi va siz (deyarli!) Har bir narsa uchun paket mavjudligiga amin bo'lishingiz mumkin.

U Node.js paketlarining qaramliklarini yuklab olish va boshqarishning bir usuli sifatida boshlangan, ammo shu vaqtdan boshlab u oldingi JavaScript-da ishlatiladigan vositaga aylandi.

Npm qiladigan ko'plab narsalar mavjud.

Yuklashlar

npm sizning loyihangizga bog'liqliklarni yuklashni boshqaradi.

Barcha qaramliklarni o'rnatish

Agar loyihada packages.json fayl bo'lsa, uni ishga tushirish orqali

npm o'rnatish

u node_modules papkasida loyihaga kerak bo'lgan hamma narsani o'rnatadi, agar u mavjud bo'lmasa, uni yaratadi.

Bitta paketni o'rnatish

Bundan tashqari, chopish orqali ma'lum bir paketni o'rnatishingiz mumkin

npm o'rnatish 

Ko'pincha siz ushbu buyruqqa qo'shimcha bayroqlar qo'shilishini ko'rasiz:

  • --save paketni o'rnatadi va yozuvni pack.json fayl bog'liqligiga qo'shadi
  • --save-dev o'rnatadi va yozuvni pack.json devDependencies fayliga qo'shadi

Farq shundaki, devDependentsiya odatda ishlab chiqarish vositasi bo'lib, sinov kutubxonasi singari, qaramlik esa ishlab chiqarishda ilova bilan birlashtirilgan.

Paketlarni yangilash

Yangilanish, shuningdek, yugurish orqali osonlashtiriladi

npm yangilanish

npm barcha paketlarni sizning versiyangiz cheklovlarini qondiradigan yangi versiya uchun tekshiradi.

Siz shuningdek yangilash uchun bitta to'plamni belgilashingiz mumkin:

npm yangilash 

Versiyalar

Oddiy yuklashlardan tashqari, npm ham versiyani boshqarishni boshqaradi, shuning uchun paketning biron bir aniq versiyasini ko'rsatishingiz yoki sizga kerak bo'lganidan yuqori yoki pastroq versiyasini talab qilishingiz mumkin.

Ko'p marta siz kutubxonani faqat boshqa kutubxonaning katta nashriga mos kelishini topasiz.

Yoki eng so'nggi nashr qilingan lib nashridagi xato muammoni keltirib chiqarmoqda.

Kutubxonaning aniq versiyasini belgilash hammani paketning aniq versiyasida ushlab turishga yordam beradi, shunda pack.json fayli yangilanmaguncha butun jamoa bir xil versiyada ishlaydi.

Ushbu holatlarning barchasida versiya ko'p yordam beradi va npm semantik versiya (semver) standartiga mos keladi.

Vazifalarni bajarish

Packet.json fayli ishlatib bajarilishi mumkin bo'lgan buyruq qatori vazifalarini ko'rsatadigan formatni qo'llab-quvvatlaydi

npm 

Masalan:

{
  "skriptlar": {
    "start-dev": "lib / server-tugunni rivojlantirish",
    "start": "lib / server-ishlab chiqarish tugmasi"
  }
}

Veb-paketni ishga tushirish uchun ushbu xususiyatdan foydalanish juda keng tarqalgan:

{
  "skriptlar": {
    "watch": "veb-paket - soatlar - progress - ranglar --config webpack.conf.js",
    "dev": "veb-paket - progress - ranglar --config webpack.conf.js",
    "prod": "NODE_ENV = ishlab chiqarish veb-paketi -p --config webpack.conf.js",
  }
}

Shunday qilib, unutish yoki xato qilish oson bo'lgan uzoq buyruqlarni terish o'rniga, siz ishlata olasiz

soat n / soat
dd / soat dev
$ npm prod

Npm paketlarni qaerga o'rnatadi?

Npm (yoki ip) yordamida paketni o'rnatganingizda, siz ikkita turdagi o'rnatishni amalga oshirishingiz mumkin:

  • mahalliy o'rnatish
  • global o'rnatish

Odatiy bo'lib, npm o'rnatish buyrug'ini kiritganingizda, masalan:

npm lodashni o'rnatish

paket hozirgi fayl daraxti ostida, node_modules pastki papkasi ostida o'rnatilgan.

Bu sodir bo'lganda, npm lodash yozuvini joriy papkada mavjud pack.json fayliga bog'liqlik xususiyatiga qo'shadi.

Global o'rnatish -g bayrog'i yordamida amalga oshiriladi:

npm o'rnatish -g lodash

Bu sodir bo'lganda, npm paketni mahalliy papka ostiga o'rnatmaydi, aksincha u global manzildan foydalanadi.

Qayerda, aniqmi?

Npm root -g buyrug'i sizning kompyuteringizda aniq manzil qaerda ekanligi haqida ma'lumot beradi.

MacOS yoki Linuxda bu joy / usr / local / lib / node_modules bo'lishi mumkin. Windows-da C: \ Users \ YOU \ AppData \ Roaming \ npm \ node_modules bo'lishi mumkin.

Agar siz Node.js versiyalarini boshqarish uchun nvm-dan foydalansangiz, ammo u joy boshqacha bo'lar edi.

Men, masalan nvm-ni ishlataman va paketlarimning joylashuvi / Users / flavio / .nvm / versions / node / v8.9.0 / lib / node_modules sifatida ko'rsatilgan.

Npm-dan foydalanib o'rnatilgan paketni qanday ishlatish yoki bajarish kerak

Sizning node_modules papkasida o'rnatilgan paketni kodingizga qanday kiritish va ulardan qanday foydalanish kerak

Npm paketini node_modules papkangizga yoki global miqyosda o'rnatganingizda, siz uni Node kodingizda qanday ishlatasiz?

Siz foydalanadigan lodash-ni, JavaScript-ning mashhur yordamchi kutubxonasini o'rnatasiz

npm lodashni o'rnatish

U paketni mahalliy node_modules papkasida o'rnatmoqchi.

Uni sizning kodingizda ishlatish uchun uni quyidagi talablardan foydalangan holda dasturingizga import qilishingiz kerak:

const _ = talab qilish ('lodash)

Sizning paketingiz ijro etiladigan bo'lsa-chi?

Bunday holda, u bajariladigan faylni node_modules / .bin / papka ostiga qo'yadi.

Buni namoyish qilishning oson usullaridan biri bu sigir.

Sigir sig'imi paketi sigirga (va boshqa hayvonlarga) biron narsa aytish uchun bajarilishi mumkin bo'lgan buyruq qatori dasturini taqdim etadi.

Paketni npm install coway-dan foydalanib o'rnatganingizda, u o'zini va node_modules papkasida bir nechta bog'liqlikni o'rnatadi:

Yashirin .bin papkasi mavjud, unda sigara ikkiliklariga ramziy havolalar mavjud.

Siz ularni qanday bajarsiz?

Albatta, uni ishga tushirish uchun ./node_modules/.bin/cowsay turini kiritishingiz mumkin va u ishlaydi, ammo npm ning so'nggi versiyalariga kiritilgan npx (5.2 dan beri) ancha yaxshi tanlovdir. Siz shunchaki yugurasiz:

npx sigir

va npx to'plam manzilini topadi.

Pack.json qo'llanmasi

Pack.json fayli Node.js ekotizimiga asoslangan ko'plab dastur kodlari bazasidagi asosiy elementdir.

Agar siz JavaScript bilan ishlasangiz yoki JavaScript loyihasi, Node.js yoki oldingi loyiha bilan aloqa o'rnatgan bo'lsangiz, shubhasiz pack.json faylini uchratdingiz.

Buning nima keragi bor? Bu haqda nimani bilishingiz kerak va siz u bilan nima qila oladigan ajoyib narsalar bor?

Package.json fayli sizning loyihangiz uchun bir xil manifest. U mutlaqo bog'liq bo'lmagan ko'p narsalarni qilishi mumkin. Bu, masalan, asboblar uchun konfiguratsiyaning markaziy ombori. Shuningdek, npmand iplari to'plamning nomlari va versiyalari saqlanadigan joyda.

Fayl tuzilishi

Mana, pack.json fayliga misol:

{
}

Bo'sh! Ilova uchun pack.json faylida bo'lishi kerak bo'lgan qat'iy talablar yo'q. Faqatgina talab shundaki, u JSON formatini hurmat qiladi, aks holda uni xususiyatlariga dasturiy ravishda kirishga harakat qiladigan dasturlar uni o'qiy olmaydi.

Agar siz npm-ga tarqatadigan Node.js paketini yaratayotgan bo'lsangiz, u tubdan o'zgaradi va siz boshqalarga undan foydalanishda yordam beradigan xususiyatlarga ega bo'lishingiz kerak. Bu haqda keyinroq bilib olamiz.

Bu yana bir pack.json:

{
  "name": "test-loyiha"
}

Bu fayl yashaydigan papkada joylashgan ilova yoki paket nomini bildiradigan ism xususiyatini belgilaydi.

Men Vue.js namunasidan uni olgan juda murakkab misol.

{
  "name": "test-loyiha",
  "versiya": "1.0.0",
  "description": "Vue.js loyihasi",
  "main": "src / main.js",
  "shaxsiy": haqiqiy,
  "skriptlar": {
    "dev": "veb-paket-dev-server --inline --progress --config build / webpack.dev.conf.js",
    "start": "npm run dev",
    "birlik": "jest --config test / birlik / jest.conf.js - ochish",
    "sinov": "npm yugurish birligi",
    "lint": "eslint - text .js, .vue src sinov / birlik",
    "qurish": "tugunni qurish / qurish.js"
  },
  "qaramliklar": {
    "vue": "^ 2.5.2"
  },
  "devDependents": {
    "avtoprefiks": "^ 7.1.2",
    "babel-core": "^ 6.22.1",
    "babel-eslint": "^ 8.2.1",
    "babel-helper-vue-jsx-merge-props": "^ 2.0.3",
    "babel-jest": "^ 21.0.2",
    "babel loader": "^ 7.1.1",
    "babel-plugin-dynamic-import-tugun": "^ 1.2.0",
    "babel-plugin-syntax-jsx": "^ 6.18.0",
    "babel-plugin-transform-es2015-modules-commonjs": "^ 6.26.0",
    "babel-plugin-transform-runtime": "^ 6.22.0",
    "babel-plugin-transform-vue-jsx": "^ 3.5.0",
    "babel-preset-env": "^ 1.3.2",
    "babel-oldindan belgilab qo'yilgan bosqich-2": "^ 6.22.0",
    "bo'r": "^ 2.0.1",
    "copy-webpack-plagin": "^ 4.0.1",
    "css-loader": "^ 0.28.0",
    "eslint": "^ 4.15.0",
    "eslint-config-airbnb-base": "^ 11.3.0",
    "eslint-Friend-formatter": "^ 3.0.0",
    "eslint-import-fixver-webpack": "^ 0.8.3",
    "eslint-loader": "^ 1.7.1",
    "eslint-plugin-import": "^ 2.7.0",
    "eslint-plugin-vue": "^ 4.0.0",
    "extract-text-webpack-plugin": "^ 3.0.0",
    "file-loader": "^ 1.1.4",
    "do'st-xatolar-veb-paket-plagin": "^ 1.6.1",
    "html-webpack-plugin": "^ 2.30.1",
    "jest": "^ 22.0.4",
    "jest-serializer-vue": "^ 0.3.0",
    "node-notifier": "^ 5.1.2",
    "optimiz-css-aktivlari-webpack-plagin": "^ 3.2.0",
    "ora": "^ 1.2.0",
    "portfinder": "^ 1.0.13",
    "postcss-import": "^ 11.0.0",
    "postcss-loader": "^ 2.0.8",
    "postcss-url": "^ 7.2.1",
    "rimraf": "^ 2.6.0",
    "semver": "^ 5.3.0",
    "shelljs": "^ 0.7.6",
    "uglifyjs-webpack-plagin": "^ 1.1.1",
    "url-loader": "^ 0.5.8",
    "vue-jest": "^ 1.0.2",
    "vue-loader": "^ 13.3.0",
    "vue-style-loader": "^ 3.0.1",
    "vue-shablon-kompilyator": "^ 2.5.2",
    "veb-paket": "^ 3.6.0",
    "veb-paket-to'plam-tekshirgich": "^ 2.9.0",
    "webpack-dev-server": "^ 2.9.1",
    "veb-paketni birlashtirish": "^ 4.1.0"
  },
  "dvigatellar": {
    "tugun": "> = 6.0.0",
    "npm": "> = 3.0.0"
  },
  "brauzerlar ro'yxati": [
    "> 1%",
    "oxirgi 2 versiya",
    "emas, balki <= 8"
  ]
}

bu erda juda ko'p narsa bor:

  • name dastur / paket nomini o'rnatadi
  • versiya joriy versiyani bildiradi
  • description bu ilova / paketning qisqacha tavsifi
  • asosiy dastur uchun kirish joyini belgilaydi
  • agar rost o'rnatilgan bo'lsa, dastur / paketning npm-da tasodifiy e'lon qilinishini oldini oladi
  • skriptlar siz ishlashingiz mumkin bo'lgan tugun skriptlarining to'plamini belgilaydi
  • qaramlik qaramlik sifatida o'rnatilgan npm paketlarning ro'yxatini belgilaydi
  • devDependencies ishlab chiqishga bog'liqlik sifatida o'rnatilgan npm paketlar ro'yxatini belgilaydi
  • dvigatellar ushbu paket / ilova tugunining qaysi versiyalari ishlashini belgilaydi
  • brauzerlar ro'yxati qaysi brauzerlarni (va ularning versiyalarini) qo'llab-quvvatlashni xohlashingizni aniqlash uchun ishlatiladi

Ushbu xususiyatlarning barchasi npm yoki biz foydalanishimiz mumkin bo'lgan boshqa vositalar tomonidan ishlatiladi.

Xususiyatlarning buzilishi

Ushbu bo'limda siz batafsil foydalanishingiz mumkin bo'lgan xususiyatlar tasvirlangan. Men "paket" ga murojaat qilaman, lekin xuddi shu narsa siz paket sifatida foydalanmaydigan mahalliy dasturlarga tegishli.

Ushbu xususiyatlarning aksariyati faqat npm veb-saytida ishlatiladi, boshqalari - npm yoki boshqalar kabi kodingiz bilan o'zaro aloqada bo'lgan skriptlar.

nomi

Paket nomini o'rnatadi.

Masalan:

"name": "test-loyiha"

Ism 214 belgidan kam bo'lishi kerak, bo'sh joy bo'lmasligi kerak, unda faqat kichik harflar, defis (-) yoki pastki chiziqlar (_) bo'lishi mumkin.

Buning sababi, paket npm-da e'lon qilinganida, ushbu xususiyat asosida o'z URL-manzilini oladi.

Agar siz ushbu to'plamni GitHub-da ommaga e'lon qilsangiz, GitHub omborining nomi yaxshi qiymatga ega.

muallif

Paket muallifi ismini ro'yxatlaydi

Masalan:

{
  "muallif": "Flavio Kopes  (https://flaviocopes.com)"
}

Ushbu format bilan ham foydalanish mumkin:

{
  "muallif": {
    "name": "Flavio Copes",
    "elektron pochta": "flavio@flaviocopes.com",
    "url": "https://flaviocopes.com"
  }
}

hissa qo'shganlar

Muallif bilan bir qatorda, loyihaning bir yoki bir nechta ishtirokchilari bo'lishi mumkin. Ushbu xususiyat ularni ro'yxatga olgan qatordir.

Masalan:

{
  "hissa qo'shganlar": [
    "Flavio Kopes  (https://flaviocopes.com)"
  ]
}

Ushbu format bilan ham foydalanish mumkin:

{
  "hissa qo'shganlar": [
    {
      "name": "Flavio Copes",
      "elektron pochta": "flavio@flaviocopes.com",
      "url": "https://flaviocopes.com"
    }
  ]
}

xatolar

Paketlarni chiqarishni kuzatuvchisiga, ehtimol GitHub-ga tegishli sahifalarga havolalar

Masalan:

{
  "xatolar": "https://github.com/flaviocopes/package/issues"
}

bosh sahifa

Paketning bosh sahifasini o'rnatadi

Masalan:

{
  "bosh sahifa": "https://flaviocopes.com/package"
}

versiyasi

Paketning hozirgi versiyasini bildiradi.

Masalan:

"versiya": "1.0.0"

Ushbu xususiyat versiyalar uchun semantik versiya (semver) notasiga amal qiladi, ya'ni versiya har doim uchta raqam bilan ifodalanadi: x.x.x.

Birinchi raqam asosiy versiya, ikkinchisi kichik versiya va uchinchisi yamoq versiyasi.

Ushbu raqamlarda bir ma'no bor: faqatgina xatolarni tuzatadigan versiya - yamoqlarni qayta tiklash, orqaga mos keladigan o'zgarishlarni kiritadigan versiya ahamiyatsiz versiya, katta versiyada buzilishlar bo'lishi mumkin.

litsenziya

Paketning litsenziyasini ko'rsatadi.

Masalan:

"litsenziya": "MIT"

kalit so'zlar

Ushbu xususiyat paketingiz bajaradigan narsalar bilan bog'liq bo'lgan bir qator kalit so'zlarni o'z ichiga oladi.

Masalan:

"kalit so'zlar": [
  "elektron pochta",
  "mashina o'rganish",
  "oy"
]

Bu shunga o'xshash paketlarni ko'rishda yoki npm veb-saytini ko'rishda odamlarga sizning paketingizni topishga yordam beradi.

tavsifi

Ushbu xususiyat paketning qisqacha tavsifini o'z ichiga oladi.

Masalan:

"description": "Strings bilan ishlash uchun paket"

Bu, ayniqsa, odamlar paketning nima ekanligini bilib olishlari uchun paketingizni npm-ga nashr qilishni qaror qilsangiz foydalidir.

omborxona

Ushbu xususiyat ushbu paket ombori joylashgan joyni aniqlaydi.

Masalan:

"omborxona": "gitub: flaviokoplar / sinov",

Github prefiksiga e'tibor bering. Boshqa mashhur xizmatlar mavjud:

"ombor": "gitlab: flaviokoplar / sinov",
"ombor": "bitbucket: flaviocopes / sinov",

Siz versiyani boshqarish tizimini aniq o'rnatishingiz mumkin:

"omborxona": {
  "turi": "git",
  "url": "https://github.com/flaviocopes/testing.git"
}

Siz turli xil versiyalarni boshqarish tizimlaridan foydalanishingiz mumkin:

"omborxona": {
  "turi": "svn",
  "url": "..."
}

asosiy

Paket uchun kirish joyini sozlaydi.

Ushbu paketni dasturga import qilganingizda, dastur modul eksportini qidiradi.

Masalan:

"main": "src / main.js"

xususiy

agar "true" o'rnatilgan bo'lsa, dastur / paketning tasodifiy npm-da e'lon qilinishini oldini oladi

Masalan:

"xususiy": haqiqiy

skriptlar

Siz ishga tushirishingiz mumkin bo'lgan tugun skriptlarining to'plamini belgilaydi

Masalan:

"skriptlar": {
  "dev": "veb-paket-dev-server --inline --progress --config build / webpack.dev.conf.js",
  "start": "npm run dev",
  "birlik": "jest --config test / birlik / jest.conf.js - ochish",
  "sinov": "npm yugurish birligi",
  "lint": "eslint - text .js, .vue src sinov / birlik",
  "qurish": "tugunni qurish / qurish.js"
}

Ushbu skriptlar buyruq qatori ilovalari. Siz ularni npm XXXX yoki XXXX iplarini chaqirish orqali boshqarishingiz mumkin, bu erda XXXX - buyruq nomi.

Masalan:
npm ishlaydigan dev

Siz buyruq uchun xohlagan ismdan foydalanishingiz mumkin, va skriptlar siz xohlagan narsani bajarishi mumkin.

qaramlik

Bog'lanish sifatida o'rnatilgan npm paketlar ro'yxatini belgilaydi.

Npm yoki ip yordamida paketni o'rnatganingizda:

npm o'rnatish 
ip qo'shing 

paket avtomatik ravishda ushbu ro'yxatga kiritiladi.

Masalan:

"qaramliklar": {
  "vue": "^ 2.5.2"
}

devDependentsiyalar

Rivojlanishning bog'liqligi sifatida o'rnatilgan npm paketlar ro'yxatini belgilaydi.

Ular qaramlikdan farq qiladi, chunki ular ishlab chiqarishda kodni ishga tushirish uchun kerak bo'lmagan, faqat ishlab chiqarish mashinasida o'rnatilishi kerak.

Npm yoki ip yordamida paketni o'rnatganingizda:

npm o'rnatish --dev 
ip qo'shish --dev 

paket avtomatik ravishda ushbu ro'yxatga kiritiladi.

Masalan:

"devDependents": {
  "avtoprefiks": "^ 7.1.2",
  "babel-core": "^ 6.22.1"
}

dvigatellar

Ushbu paket / ilova Node.js va boshqa buyruqlarning qaysi versiyalari ishlashini belgilaydi.

Masalan:

"dvigatellar": {
  "tugun": "> = 6.0.0",
  "npm": "> = 3.0.0",
  "ip": "^ 0.13.0"
}

brauzerlar ro'yxati

Qaysi brauzerlarni (va ularning versiyalarini) qo'llab-quvvatlashni xohlashingizni aytishda ishlatiladi. Babel, Autoprefixer va boshqa vositalar faqat siz maqsad qilgan brauzerlarga kerak bo'lgan polifiller va kamchiliklarni qo'shish uchun ishora qiladi.

Masalan:

"brauzerlar ro'yxati": [
  "> 1%",
  "oxirgi 2 versiya",
  "emas, balki <= 8"
]

Ushbu konfiguratsiya, IE8 va undan past darajadan tashqari (brauzerlar ro'yxatida ko'proq ma'lumotga ega) tashqari, brauzerlarning so'nggi 2 ta asosiy versiyasini kamida 1% foydalanish bilan (CanIUse.com statistikasidan olingan) qo'llab-quvvatlamoqchi ekanligingizni anglatadi.

Buyruqning o'ziga xos xususiyatlari

Pack.json fayli shuningdek buyruq uchun maxsus konfiguratsiyaga ega bo'lishi mumkin, masalan Babel, ESLint va boshqalar.

Ularning har biri o'ziga xos xususiyatga ega, masalan, eslintConfig, babel va boshqalar. Bular buyruqlarga xos va tegishli buyruq / loyiha hujjatlarida ulardan qanday foydalanishni topishingiz mumkin.

Paket versiyalari

Siz yuqoridagi tavsifda quyidagi kabi versiya raqamlarini ko'rdingiz: ~ 3.0.0 yoki ^ 0.13.0. Ular nimani anglatadi va yana qaysi versiya aniqlovchilaridan foydalanishingiz mumkin?

Ushbu belgi sizga bog'liqligingizdan qaysi paketni qabul qilishni belgilaydi.

Semver (semantik versiya) yordamida barcha versiyalarda 3 ta raqam mavjudligini hisobga olsak, birinchi versiya asosiy versiya, ikkinchisi kichik versiya va uchinchisi patch versiyasidir, sizda quyidagi qoidalar mavjud:

  • ~: agar siz 0.13.0 deb yozsangiz, siz faqatgina patch relizlarini yangilashni xohlaysiz: 0.13.1 yaxshi, lekin 0.14.0 unday emas.
  • ^: agar siz ^ 0.13.0 yozsangiz, yamoq va kichik nashrlarni yangilashni xohlaysiz: 0.13.1, 0.14.0 va hokazo.
  • *: agar siz yozsangiz *, demak siz barcha yangilanishlarni, shu jumladan asosiy versiya yangilanishlarini qabul qilasiz.
  • >: siz ko'rsatganingizdan yuqori har qanday versiyani qabul qilasiz
  • > =: siz ko'rsatilgan versiyaga teng yoki undan yuqori bo'lgan har qanday versiyani qabul qilasiz
  • <=: siz belgilangan versiyaga teng yoki pastroq bo'lgan har qanday versiyani qabul qilasiz
  • <: siz belgilangan versiyadan pastroq bo'lgan har qanday versiyani qabul qilasiz

Boshqa qoidalar ham mavjud:

  • hech qanday belgi: siz faqat aniq belgilangan versiyani qabul qilasiz
  • eng so'nggi: mavjud versiyani ishlatishni xohlaysiz

va yuqorida aytilganlarning ko'pini ushbu diapazonda birlashtirishingiz mumkin, masalan: 1.0.0 || > = 1.1.0 <1.2.0, 1.0.0 dan foydalanish yoki 1.1.0 dan yuqoriroq bo'lgan bitta versiyani ishlatish uchun, lekin 1.2.0 dan pastroq.

Pack-lock.json fayli

Pack-lock.json fayli tugun paketlarini o'rnatishda avtomatik ravishda yaratiladi.

5-versiyada npm pack-lock.json faylini taqdim etdi.

Nima u? Ehtimol, ancha keng tarqalgan va uzoq vaqtdan beri mavjud bo'lgan pack.json fayli haqida bilasiz.

Faylning maqsadi har bir paketning aniq versiyasini kuzatib borishdir, shunda mahsulot 100% takrorlanuvchan bo'lishi uchun, hatto paketlar xizmat ko'rsatuvchilar tomonidan yangilangan bo'lsa ham.

Bu pack.json hal qilinmagan juda aniq muammoni hal qiladi. Pack.json-da semver yozuvidan foydalanib, qaysi versiyani (patch yoki minor) yangilashni o'rnatishingiz mumkin, masalan:

  • agar siz ~ 0.13.0 deb yozsangiz, siz faqatgina patch relizlarini yangilashni xohlaysiz: 0.13.1 yaxshi, lekin 0.14.0 emas.
  • agar siz ^ 0.13.0 deb yozsangiz, yamoq va mayda nashrlarni yangilashni xohlaysiz: 0.13.1, 0.14.0 va hokazo.
  • agar siz 0.13.0 ni yozsangiz, bu har doim ishlatiladigan aniq versiya

Siz node_modules papkasini Git-ga majbur qilmaysiz, bu odatda juda katta va agar siz npm-ni o'rnatish buyrug'i yordamida boshqa mashinada loyihani nusxalashga harakat qilsangiz, agar siz ~ sintaksisni va paketning yamoq versiyasini chiqargan bo'lsangiz. , u o'rnatiladi ^ Va kichik nashrlar uchun ham xuddi shunday.

Agar misolda 0.13.0 singari aniq versiyalarni ko'rsatsangiz, bu muammo sizga ta'sir qilmaydi.

Siz yoki siz npm o'rnatish orqali dunyoning narigi tomonida loyihani boshlashga urinayotgan boshqa kishi bo'lishingiz mumkin.

Shunday qilib sizning original loyihangiz va yangi boshlangan loyihangiz aslida boshqacha. Agar yamoq yoki uncha katta bo'lmagan versiya buzilishlarni kiritmasa ham, biz hammamiz xatolarga o'tishi mumkinligini bilamiz.

Pack-lock.json har bir paketning hozirda o'rnatilgan versiyasini toshga o'rnatadi va npm ni o'rnatishda npm aniq versiyalaridan foydalanadi.

Ushbu kontseptsiya yangi emas va boshqa dasturlash tillari paket menejerlari (masalan, PHP-dagi Composer) yillar davomida shunga o'xshash tizimdan foydalanadilar.

Pack-lock.json faylini sizning Git omboringizga yuklashingiz kerak, shuning uchun uni boshqa odamlar olishlari mumkin, agar loyiha ommaviy bo'lsa yoki sizda sheriklar bo'lsa yoki siz Git-dan foydalanish uchun manba sifatida foydalansangiz.

Npm yangilanishini ishga tushirganda, qaramlik versiyalari pack-lock.json faylida yangilanadi.

Bir misol

Bu npm-ni ishga tushirishda bo'sh papkaga coway-ni o'rnatishda olinadigan pack-lock.json faylining namunasi:

{
  "talab qiladi": haqiqiy,
  "lockfileVersion": 1,
  "qaramliklar": {
    "ansi-regex": {
      "versiya": "3.0.0",
      "qaror qilindi": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.
0.0.tgz ",
      "yaxlitlik": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg ="
    },
    "coway": {
      "versiya": "1.3.1",
      "qaror qilindi": "https://registry.npmjs.org/cowsay/-/cowsay-1.3.1.tgz"
,
      "yaxlitlik": "sha512-3PVFe6FePVtPj1HTeLin9v8WyLl + VmM1l1H / 5P + BTTDkM
Ajufp + 0F9eLjzRnOHzVAYeIYFF5po5NjRrgefnRMQ == ",
      "talab qiladi": {
        "get-stdin": "^ 5.0.1",
        "optimist": "~ 0.6.1",
        "tor-kenglik": "~ 2.1.1",
        "strip-eof": "^ 1.0.0"
      }
    },
    "get-stdin": {
      "versiya": "5.0.1",
      "qaror qilindi": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.
1.tgz ",
      "yaxlitlik": "sha1-Ei4WFZHiH / TFJTAwVpPyDmOTo5g ="
    },
    "bu-kenglik-kod-nuqta": {
      "versiya": "2.0.0",
      "qaror qilindi": "https://registry.npmjs.org/is-fullwidth-code-point/-/
to'la kenglik-kod-2.0.0.tgz ",
      "yaxlitlik": "sha1-o7MKXE8ZkYMWeqq5O + 764937ZU8 ="
    },
    "minimist": {
      "versiya": "0.0.10",
      "qaror qilindi": "https://registry.npmjs.org/minimist/-/minimist-0.0.10
.tgz ",
      "yaxlitlik": "sha1-3j + YVD2 / lggr5IrRoMfNqDYwHc8 ="
    },
    "optimist": {
      "versiya": "0.6.1",
      "qaror qilindi": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
      "yaxlitlik": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY =",
      "talab qiladi": {
        "minimist": "~ 0.0.1",
        "wordwrap": "~ 0.0.2"
      }
    },
    "string-width": {
      "versiya": "2.1.1",
      "qaror qilindi": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
      "yaxlitlik": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw ==",
      "talab qiladi": {
        "bu-kenglik-kod-nuqta": "^ 2.0.0",
        "strip-ansi": "^ 4.0.0"
      }
    },
    "strip-ansi": {
      "versiya": "4.0.0",
      "qaror qilindi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
      "yaxlitlik": "sha1-qEeQIusaw2iocTibY1JixQXuNo8 =",
      "talab qiladi": {
        "ansi-regex": "^ 3.0.0"
      }
    },
    "strip-eof": {
      "versiya": "1.0.0",
      "qaror qilindi": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
      "yaxlitlik": "sha1-u0P / VZim6wXYm1n80SnJgzE2Br8 ="
    },
    "wordwrap": {
      "versiya": "0.0.3",
      "qaror qilindi": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
      "yaxlitlik": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc ="
    }
  }
}

Biz sigirni o'rnatdik, bu quyidagilarga bog'liq

  • get-stdin
  • optimist
  • satr kengligi
  • tasma

O'z navbatida, ushbu paketlar boshqa paketlarni ham talab qiladi, chunki biz ko'rib turganimizdek, ba'zi mulklarga ega:

  • ansi-regex
  • is-to'liq kenglik-kod-nuqta
  • minimist
  • so'z o'rash
  • tasma

Ular faylga alifbo tartibida qo'shiladi va ularning har birida versiya maydoni, paketning joylashuvini ko'rsatadigan aniqlangan maydon va paketni tekshirish uchun foydalanishimiz mumkin bo'lgan yaxlitlik satri mavjud.

Npm to'plamning o'rnatilgan versiyasini toping

O'rnatilgan npm to'plamning so'nggi versiyasini, shuningdek, ularning qaramligini ko'rish uchun:

npm ro'yxati

Masalan:

N / soat ro'yxat
/ Foydalanuvchilar / flavio / dev / tugun / coway
└─┬ coway@1.3.1
  ├── get-stdin@5.0.1
  ├─┬ optimist@0.6.1
  │ ├── minimist@0.0.10
  │ └── wordwrap@0.0.3
  ├─┬ string-width@2.1.1
  │ ├── is-fullwidth-code-point@2.0.0
  │ └─┬ strip-ansi@4.0.0
  │ └── ansi-regex@3.0.0
  └── strip-eof@1.0.0

Bundan tashqari, siz shunchaki pack-lock.json faylini ochishingiz mumkin, ammo bu ba'zi vizual tekshiruvni o'z ichiga oladi.

npm ro'yxati -g bir xil, ammo global o'rnatilgan paketlar uchun.

Faqat eng yuqori darajadagi to'plamlarni olish uchun (asosan, npm-ni o'rnatishni va pack.json-da ro'yxatdan o'tganlarni) olish uchun npm ro'yxatini --depth = 0:

N - soat ro'yxati - oyning hajmi = 0
/ Foydalanuvchilar / flavio / dev / tugun / coway
└── coway@1.3.1

Siz nomni ko'rsatib, ma'lum bir paketning versiyasini olishingiz mumkin:

N - soat kechki roʻyxat
/ Foydalanuvchilar / flavio / dev / tugun / coway
└── coway@1.3.1

Bu shuningdek siz o'rnatgan paketlarning bog'liqliklari uchun ishlaydi:

N / min. Ro'yxat minimist
/ Foydalanuvchilar / flavio / dev / tugun / coway
└─┬ coway@1.3.1
  └─┬ optimist@0.6.1
    └── minimist@0.0.10

Agar npm omborida paketning eng so'nggi versiyasi mavjudligini bilmoqchi bo'lsangiz, npm view [pack_name] versiyasini ishga tushiring:

N / s, qoraqalpoq versiyasi
1.3.1

Npm paketining eski versiyasini o'rnating

Npm to'plamining eski versiyasini o'rnatish moslik muammosini hal qilishda foydali bo'lishi mumkin.

@ Sintaksisi yordamida npm paketining eski versiyasini o'rnatishingiz mumkin:

npm o'rnatish  @ 

Masalan:

npm sigirni o'rnatish

1.3.1 versiyasini o'rnatadi (yozish paytida).

1.2.0 versiyasini o'rnating:

npm-ga coway@1.2.0-ni o'rnating

Xuddi shu narsa global paketlarda ham amalga oshirilishi mumkin:

npm o'rnatish -g webpack@4.16.4

Shuningdek, paketning oldingi barcha nusxalarini ro'yxatga olish bilan qiziqishingiz mumkin. Siz buni npm view versiyalari bilan qilishingiz mumkin:

N / s, qoraqalpoq versiyasini ko'rish
['1.0.0',
  '1.0.1',
  '1.0.2',
  '1.0.3',
  '1.1.0',
  '1.1.1',
  '1.1.2',
  '1.1.3',
  '1.1.4',
  '1.1.5',
  '1.1.6',
  '1.1.7',
  '1.1.8',
  '1.1.9',
  '1.2.0',
  '1.2.1',
  '1.3.0',
  '1.3.1']

Barcha tugun bog'liqliklarini eng so'nggi versiyasiga yangilang

npm install-dan foydalanib paketni o'rnatganingizda, paketning so'nggi versiyasi yuklab olinadi va node_modules papkasiga joylashtiriladi va pack.json va pack-lock.json fayllariga tegishli yozuv qo'shiladi. sizning joriy papkangiz.

npm qaramlikni hisoblab chiqadi va ularning eng so'nggi versiyasini o'rnatadi.

Aytaylik, siz sigirni gapirishga imkon beradigan ajoyib buyruq qatori sigirini o'rnatasiz.

Kechqurun naychadan coway o'rnatganingizda, ushbu yozuv pack.json fayliga qo'shiladi:

{
  "qaramliklar": {
    "coway": "^ 1.3.1"
  }
}

va bu pack-lock.json ekstrakti, men aniqlik uchun ichki bog'liqlikni olib tashladim:

{
  "talab qiladi": haqiqiy,
  "lockfileVersion": 1,
  "qaramliklar": {
    "coway": {
      "versiya": "1.3.1",
      "qaror qilindi": "https://registry.npmjs.org/cowsay/-/cowsay-1.3.1.tgz",
      "yaxlitlik": "sha512-3PVFe6FePVtPj1HTeLin9v8WyLl + VmM1l1H / 5P + BTTDkMAjufp + 0F9eLjzRnOHzVAYeIYFF5po5NjRrgefnRMQ ==",
      "talab qiladi": {
        "get-stdin": "^ 5.0.1",
        "optimist": "~ 0.6.1",
        "tor-kenglik": "~ 2.1.1",
        "strip-eof": "^ 1.0.0"
      }
    }
  }
}

Endi ushbu 2 ta fayl bizga 1.3.1 versiyasini o'rnatganligini aytadi va yangilanish uchun bizning qoidamiz ^ 1.3.1, bu npm versiyasi uchun qoidalar (keyinroq tushuntirilgan) npm yamalar va kichik versiyalar uchun yangilanishini anglatadi: 0.13 .1, 0.14.0 va boshqalar.

Agar yangi kichik yoki patch versiyasi bo'lsa va biz npm yangilanishini yozsak, o'rnatilgan versiya yangilanadi va pack-lock.json fayli sinchkovlik bilan yangi versiya bilan to'ldiriladi.

pack.json o'zgarishsiz qoladi.

Paketlarning yangi nashrlarini kashf qilish uchun siz npm-ni eskirgan rejimida ishlaysiz.

Mana bir vaqtlar men yangilamagan bitta omborda bir necha eskirgan paketlarning ro'yxati:

Ushbu yangilanishlarning ba'zilari asosiy nashrdir. Npm yangilanishi bilan ishlaydiganlar ushbu versiyani yangilamaydilar. Asosiy relizlar hech qachon bu tarzda yangilanmaydi, chunki ular (ta'rifiga ko'ra) keskin o'zgarishlarni kiritadilar va npm sizni muammolardan xalos qilishni xohlashadi.

Barcha paketlarni yangi asosiy versiyasiga yangilash uchun npm-check-updates paketini global ravishda o'rnating:

npm o'rnatish -g npm-tekshirish-yangilanishlar

keyin uni ishga tushiring:

ncu -u

Bu pack.json faylidagi barcha versiyalarga bog'liqlik va devDependentsiyalarni yaxshilaydi, shuning uchun npm yangi asosiy versiyani o'rnatishi mumkin.

Endi yangilanishni ishga tushirishga tayyormiz:

npm yangilanish

Agar siz node_modules-ga bog'liqliksiz loyihani yuklab olgan bo'lsangiz va avval yangi versiyalarini o'rnatmoqchi bo'lsangiz, shunchaki ishlating

npm o'rnatish

Npm-dan foydalanib semantik versiya

Semantik versiya - bu versiyalarga ma'no berish uchun ishlatiladigan konventsiya.

Agar Node.js to'plamlarida bitta ajoyib narsa bo'lsa, ularning hammasi o'zlarining versiyalarini raqamlash uchun Semantik versiyani ishlatishga kelishib olindi.

Semantik talqin qilish tushunchasi oddiy: barcha versiyalarda 3 ta raqam mavjud: x.y.z.

  • birinchi raqam asosiy versiya
  • ikkinchi raqam kichik versiya
  • uchinchi raqam - bu yamoq versiyasi

Siz yangi chiqarganingizda, siz xohlagan raqamlar sonini ko'paytirmaysiz, lekin sizda quyidagi qoidalar mavjud:

  • siz mos kelmaydigan API o'zgarishlarini amalga oshirganingizda asosiy versiyani to'ldirasiz
  • Agar siz mos kelmaydigan tarzda funksionallik qo'shsangiz, siz kichik versiyani chiqarasiz
  • orqaga mos keladigan xatolarni tuzatishda siz patch versiyasini yangilaysiz

Konventsiya barcha dasturlash tillarida qabul qilingan va har bir npm to'plami unga amal qilishi juda muhim, chunki butun tizim bunga bog'liq.

Nega bu shunchalik muhim?

Npm pack.json fileto-da biz foydalanishimiz mumkin bo'lgan ba'zi qoidalarni o'rnatganligi sababli, npm yangilanishini ishga tushirganimizda paketlarimizni yangilaydigan versiyani tanlang.

Qoidalarda ushbu belgilar qo'llaniladi:

  • ^
  • ~
  • >
  • > =
  • <
  • <=
  • =
  • -
  • ||

Ushbu qoidalarni batafsil ko'rib chiqaylik:

  • ^: agar npm yangilanishi paytida ^ 0.13.0 yozsangiz, u yamoq va kichik nashrlarga yangilanishi mumkin: 0.13.1, 0.14.0 va hokazo.
  • ~: agar siz ~ 0.13.0 deb yozsangiz, npm yangilanishi paytida u patch relizlariga yangilanishi mumkin: 0.13.1 yaxshi, lekin 0.14.0 emas.
  • >: siz ko'rsatganingizdan yuqori har qanday versiyani qabul qilasiz
  • > =: siz ko'rsatilgan versiyaga teng yoki undan yuqori bo'lgan har qanday versiyani qabul qilasiz
  • <=: siz belgilangan versiyaga teng yoki pastroq bo'lgan har qanday versiyani qabul qilasiz
  • <: siz belgilangan versiyadan pastroq bo'lgan har qanday versiyani qabul qilasiz
  • =: siz aniq versiyani qabul qilasiz
  • -: siz bir qator versiyalarni qabul qilasiz. Masalan: 2.1.0 - 2.6.2
  • ||: siz to'plamlarni birlashtirasiz. Masalan: <2.1 || > 2.6

Siz ushbu belgilarning ba'zilarini birlashtira olasiz, masalan 1.0.0 || > = 1.1.0 <1.2.0 1.0.0 dan foydalanish uchun yoki 1.1.0dan yuqorisiga bitta versiya, lekin 1.2.0 dan pastroq.

Boshqa qoidalar ham mavjud:

  • belgi yo'q: faqat siz ko'rsatgan aniq versiyani qabul qilasiz (1.2.1)
  • eng so'nggi: mavjud versiyani ishlatishni xohlaysiz

Npm paketlarini mahalliy yoki global ravishda o'chirish

Oldin o'zingiz o'rnatgan paketni (node_modules papkasida npm o'rnatish-ni ishlatib) olib tashlash uchun quyidagi amallarni bajaring:

npm  ni olib tashlang

-S bayrog'i yoki --save yordamida ushbu operatsiya pack.json faylidagi ma'lumotni ham olib tashlaydi.

Agar paket paketga bog'liq bo'lsa, pack.json faylining devDependentsentsiyalarida ko'rsatilgan bo'lsa, uni fayldan olib tashlash uchun -D / --save-dev bayrog'ini ishlatishingiz kerak:

npm -S  o'chirish
npm -D  o'chirish

Agar paket global ravishda o'rnatilgan bo'lsa, siz -g / --global bayrog'ini kiritishingiz kerak:

npm -g  o'chirish

Masalan:

npm o'chirish -g veb-paket

va siz ushbu buyruqni tizimingizdagi istalgan joydan boshqarishingiz mumkin, chunki hozirda mavjud bo'lgan papka muhim emas.

npm global yoki mahalliy paketlar

Paket qachon dunyo bo'ylab eng yaxshi o'rnatiladi? Va nima uchun?

Mahalliy va global paketlarning asosiy farqi quyidagicha:

  • mahalliy paketlar npm-ni o'rnatadigan katalogiga o'rnatildi va ular ushbu katalog ostidagi node_modules papkasida joylashgan.
  • npm o'rnatish -g qayerda bo'lishingizdan qat'iy nazar global paketlar hamma tizimingizda bitta joyga (aniq qayerda o'rnatishingizga bog'liq) o'rnatiladi.

Sizning kodingizda ikkalasi ham bir xil tarzda talab qilinadi:

talab qilish ("paket nomi")

Xo'sh, qachon bu yoki boshqa usulda o'rnatishingiz kerak?

Umuman olganda, barcha paketlar mahalliy ravishda o'rnatilishi kerak.

Bu sizning kompyuteringizda o'nlab dasturlarga ega bo'lishingizga ishonch hosil qiladi, agar kerak bo'lsa, har bir paketning turli xil versiyalari ishlaydi.

Global paketni yangilash sizning barcha loyihalaringiz yangi nashrni ishlatishiga olib keladi va siz tasavvur qilganingizdek, bu parvarishlash nuqtai nazaridan yomon tushlarni keltirib chiqarishi mumkin, chunki ba'zi paketlar keyinchalik bog'liqlik bilan moslikni buzishi mumkin va hokazo.

Barcha loyihalarda paketlarning o'zlarining mahalliy versiyalari mavjud, garchi bu resurslar isrof bo'lib ko'rinishi mumkin bo'lsa ham, ehtimoliy salbiy oqibatlarga nisbatan minimaldir.

Paket butun dunyo bo'ylab o'rnatilishi kerak, agar u qobiqdan (CLI) ishlaydigan buyruq bilan ta'minlansa va u loyihalar ichida qayta ishlatilsa.

Siz shuningdek lokal ravishda bajariladigan buyruqlarni o'rnatishingiz va npx-dan foydalanib ularni ishga tushirishingiz mumkin, ammo ba'zi paketlar global miqyosda yaxshiroq o'rnatilgan.

Siz bilishingiz mumkin bo'lgan mashhur global paketlarning ajoyib namunalari:

  • n / soat
  • yaratish-reaksiya-ilova
  • vue-cli
  • xafa
  • mocha
  • reaktsiya-ona-kli
  • gatsby-kli
  • abadiy
  • nodemon

Ehtimol sizda bir necha paketlar sizning tizimingizda allaqachon o'rnatilgan. Siz ularni yugurish orqali ko'rishingiz mumkin:

npm ro'yxati -g - oy 0

buyruq satrida.

npm qaramlik va devDependentsiyalar

Paket qachon qaramlik, qachon u rivojlanish qaramligi?

npm-dan foydalanib npm paketini o'rnatganingizda, siz uni qaramlik sifatida o'rnatmoqdasiz.

Paket avtomatik ravishda package.json faylida, qaramliklar ro'yxati ostida ro'yxatga olinadi (5-npm holatiga ko'ra: oldin qo'lda ko'rsatishingiz kerak edi - saqlash).

Siz -D bayrog'ini yoki --save-devni qo'shsangiz, uni rivojlanishga bog'liqlik sifatida o'rnatasiz va uni devDependents listiga qo'shasiz.

Rivojlanish bilan bog'liqliklar ishlab chiqarishda foydalanilmaydigan faqat rivojlanish uchun mo'ljallangan paketlar sifatida mo'ljallangan. Masalan, paketlar, veb-paket yoki Babelni sinab ko'rish.

Ishlab chiqarishda npm o'rnatishni yozsangiz va papkada pack.json fayli bo'lsa, ular o'rnatiladi, chunki npm bu dasturni ishlab chiqish demakdir.

Ushbu rivojlanish bog'liqliklarini o'rnatmaslik uchun siz - ishlab chiqarish bayrog'ini o'rnatishingiz kerak (npm install --production).

Npx tugun paketini ishga tushirish

npx - bu Node.js kodlarini ishlatishning ajoyib usuli va ko'plab foydali funktsiyalarni taqdim etadi.

Ushbu bo'limda men 2017 yil iyul oyida chiqarilgan 5.2 npm boshlang'ich versiyada mavjud bo'lgan juda kuchli buyruqni taqdim etmoqchiman: npx.

Agar npm ni o'rnatishni xohlamasangiz, npx-ni mustaqil paket sifatida o'rnatishingiz mumkin.

npx sizga Node.js bilan tuzilgan va npm registri orqali chop etilgan kodni ishlatishga imkon beradi.

Mahalliy buyruqlarni osongina boshqaring

Node.js ishlab chiquvchilari ko'plab buyruqlar tezda bajarilishi va bajarilishi uchun global paketlar sifatida nashr etilardi.

Bu og'riq edi, chunki siz bir xil buyruqning turli xil versiyalarini haqiqatan ham o'rnatolmadingiz.

Npx buyruq nomini ishga tushirish, aniq yo'lni bilmasdan va paketning global miqyosda va foydalanuvchi yo'lida o'rnatilishini talab qilmasdan, loyihaning node_modules papkasidagi buyruqning to'g'ri havolasini avtomatik ravishda topadi.

O'rnatish kam buyruq bajarilishi

Npm ning yana bir ajoyib xususiyati bor, bu esa ularni birinchi o'rnatmasdan turib ishlashga imkon beradi.

Bu juda foydali, asosan:

  1. hech narsa o'rnatishingiz shart emas
  2. @version sintaksisidan foydalanib, bitta buyruqning turli xil versiyalarini ishlatishingiz mumkin

Npx-dan foydalanishning odatiy namoyishi - bu coway buyrug'i. coway buyruqda yozgan narsalaringizni aytib, sigirni chop etadi. Masalan:

coway "Salom" chop etadi

_______

 -------
        \ ^ __ ^
         \ (oo) \ _______
            (__) \) \ / \
                || ---- w |
                || ||

Endi, agar siz ilgari npm-dan global ravishda korsay buyrug'ini o'rnatgan bo'lsangiz, aks holda siz buyruqni bajarishda xatoga yo'l qo'yasiz.

npx npm buyrug'ini lokal o'rnatilmagan holda bajarishga imkon beradi:

npx coway "salom"

Endi bu kulgili foydasiz buyruq. Boshqa stsenariylarga quyidagilar kiradi:

  • yangi dasturlarni yaratish va ularni ishlatish uchun vue CLI vositasini ishga tushirish: npx vue my-vue-app-ni yaratish
  • create-reaktiv-ilovadan foydalanib yangi reaktiv ilovasini yaratish: npx create-reaktiv-app my-reaktiv-ilova

va yana ko'p narsalar.

Yuklab olingandan so'ng, yuklab olingan kod o'chiriladi.

Boshqa Node.js versiyasidan foydalanib ba'zi kodlarni ishga tushiring

Versiyani belgilash uchun @ dan foydalaning va npm to'plami bilan birlashtiring:

npx tugun @ 6 -v # v6.14.3
npx tugun @ 8 -v # v8.11.3

Bu nvm yoki Node versiyasini boshqarishning boshqa vositalari kabi vositalardan qochishga yordam beradi.

O'zboshimchalik bilan kod parchalarini URL manzilidan to'g'ridan-to'g'ri ishga tushiring

npx sizni npm registrida nashr etilgan paketlar bilan cheklamaydi.

Siz GitHub dasturida joylashgan kodni ishlatishingiz mumkin, masalan:

npx https://gist.github.com/zkat/4bc19503fe9e9309e2bfaa2c58074d32

Albatta, siz boshqarmaydigan kodni ishlatishda ehtiyot bo'lishingiz kerak, chunki katta kuch katta mas'uliyat yuklaydi.

Voqealar to'plami

Voqealar to'plami JavaScript haqida tushunishning eng muhim jihatlaridan biridir. Ushbu bo'limda JavaScript-ning bitta ip bilan qanday ishlashi va asenkron funktsiyalarni qanday bajarishi haqida ichki tafsilotlar tushuntiriladi.

Men yillar davomida JavaScript-ni dasturlashtirib keldim, lekin kaput ostida qanday ishlashini hali to'liq tushuna olmadim. Ushbu tushunchani batafsil bilmaslik mutlaqo yaxshi. Ammo odatdagidek, u qanday ishlashini bilish foydalidir va siz hozir qiziquvchan bo'lishingiz mumkin.

JavaScript kodingiz bitta oqimli ishlaydi. Bir vaqtning o'zida bitta narsa sodir bo'ladi.

Bu cheklov aslida juda foydali, chunki u sizning kelishuv muammolari haqida qayg'urmasdan dasturingizni qanday ko'paytirishni soddalashtiradi.

Siz faqatgina kodingizni qanday yozayotganingizga e'tibor berishingiz kerak va sinxron tarmoq qo'ng'iroqlari yoki cheksiz pastadir kabi ipni to'sib qo'yadigan narsalardan qochishingiz kerak.

Umuman olganda, ko'pgina brauzerlarda har bir jarayonni alohida holga keltirish va cheksiz pastadirli veb-sahifani blokirovka qilish yoki og'ir ishlov berishdan saqlanish uchun har bir brauzer yorlig'ida voqealar qatori mavjud.

Atrof-muhit bir vaqtning o'zida bir nechta hodisalarni boshqaradi, masalan, API qo'ng'iroqlarini boshqarish uchun. Veb-ishchilar ham o'zlarining tadbirlarida ishlaydi.

Siz asosan kodingiz bitta voqea tsiklida ishlayotgani haqida tashvishlanishingiz kerak va uni blokirovka qilmaslik uchun kodni yozing.

Hodisa doirasini blokirovka qilish

Nazoratni voqea qatoriga qaytarish uchun juda ko'p vaqt talab etadigan har qanday JavaScript kodi sahifadagi har qanday JavaScript kodining bajarilishini blokirovka qiladi, hattoki UI ipini ham bloklaydi va foydalanuvchi atrofni bosa olmaydi, sahifani aylantirmaydi va hokazo.

JavaScript-dagi deyarli barcha kirish / kirish ibtidolari bloklanmagan. Tarmoq so'rovlari, Node.js fayl tizimining ishlashi va boshqalar. Blokirovka qilish istisno bo'lib, shuning uchun JavaScript juda ko'p narsaga tayanadi va yaqinda va'da va asinx / kutishga asoslangan.

Qo'ng'iroqlar to'plami

Qo'ng'iroqlar to'plami LIFO navbati (Last In, First Out).

Hodisalar to'plami ishga tushirish kerak bo'lgan biron bir funktsiyaning mavjudligini tekshirish uchun doimiy ravishda qo'ng'iroqlarni tekshiradi.

Buni amalga oshirayotganda, u qo'ng'iroqlarni stackga topadigan har qanday funktsiyani chaqiradi va ularning har birini tartibda bajaradi.

Siz tuzatuvchida yoki brauzer konsolida siz bilan tanish bo'lishi mumkin bo'lgan xato stack izini bilasizmi?

Brauzer qo'ng'iroqlarni stekkasida mavjud qo'ng'iroq qaysi funktsiyadan kelib chiqqanligini sizga xabar qilish uchun funktsiya nomlarini qidiradi:

Hodisani takrorlash bo'yicha oddiy tushuntirish

Misol keltiraylik:

const bar = () => console.log ('bar')
const baz = () => console.log ('baz')
const foo = () => {
  konsol.log ('foo')
  bar ()
  baz ()
}
foo ()

Ushbu kod bosilgan:

foo
bar
baz

kutilganidek.

Ushbu kod ishlayotganda birinchi foo () chaqiriladi. Fo () ichida biz avval satrni (), keyin baz () ni chaqiramiz.

Ushbu vaqtda qo'ng'iroq steki quyidagicha ko'rinadi:

Har bir iteratsiyadagi voqea silsilasi qo'ng'iroq stakasida biron bir narsa bor-yo'qligini ko'rib chiqadi va uni bajaradi:

qo'ng'iroq steki bo'sh bo'lmaguncha.

Navbatdagi funktsiya bajarilishi

Yuqoridagi misol normal ko'rinishga ega, bu erda hech qanday maxsus narsa yo'q: JavaScript bajaradigan narsalarni topadi va ularni tartibda ishlaydi.

Stek aniq bo'lmaguncha funktsiyani qanday kechiktirishni ko'rib chiqaylik.

SetTimeout (() => {}), 0) dan foydalanish funktsiyani chaqirish, lekin koddagi boshqa funktsiyalar bajarilgandan keyingina bajarilishi kerak.

Ushbu misolni oling:

const bar = () => console.log ('bar')
const baz = () => console.log ('baz')
const foo = () => {
  konsol.log ('foo')
  setTimeout (bar, 0)
  baz ()
}
foo ()

Ushbu kod juda ajablanarli tarzda chop etiladi:

foo
baz
bar

Ushbu kod ishlayotganda birinchi foo () chaqiriladi. Foo () ichida biz birinchi bo'lib setTimeout deb nomlaymiz va satrni argument sifatida o'tamiz va uni imkon qadar tezroq ishga tushirishni buyuramiz, taymer sifatida 0. Keyin biz baz () deb nomlaymiz.

Ushbu vaqtda qo'ng'iroq steki quyidagicha ko'rinadi:

Mana bizning dasturimizdagi barcha funktsiyalarning bajarilish tartibi:

Nega bunday bo'lmoqda?

Xabar navbat

SetTimeout () chaqirilganda, brauzer yoki Node.js taymerni ishga tushiradi. Taymer tugashi bilanoq, bu holda kutish vaqti sifatida 0 qo'yganimizdan so'ng, qo'ng'iroqni qaytarish funktsiyasi xabar navbatiga qo'yiladi.

Xabar navbatida, shuningdek, foydalanuvchi tomonidan bosilgan klaviatura va klaviatura hodisalari yoki javoblarni olish kabi kodlar, ularga javob qaytarish imkoniyati paydo bo'lguncha navbatga qo'yiladi. Yoki onLoad kabi DOM tadbirlari.

Qopqog'i qo'ng'iroq stekiga ustunlik beradi. U avval qo'ng'iroq stekkasida topilgan hamma narsani qayta ishlaydi va u erda hech narsa yo'q bo'lgandan so'ng, xabarlarni navbatga qo'yish uchun narsalarni olish uchun ketadi.

SetTimeout, yuklash yoki boshqa narsalar singari funktsiyalarni o'z ishlarini bajarishlarini kutishimiz shart emas, chunki ular brauzer tomonidan ta'minlangan va ular o'zlarining mavzularida yashaydilar. Masalan, agar siz vaqtni o'chirish vaqtini 2 soniya qilib qo'ysangiz, 2 soniyani kutishingiz shart emas - kutish boshqa joyda bo'ladi.

ES6 ish navbat

ECMAScript 2015 va'dalar tomonidan ishlatiladigan (shuningdek, ES6 / ES2015-da taqdim etilgan) ish kuchi tushunchasini taqdim etdi. Bu chaqiriq stekining oxiriga qo'yilmasdan, asinf funktsiyasi natijasini imkon qadar tezroq bajarish usuli.

Joriy funktsiya tugashidan oldin hal qilinadigan va'dalar joriy funktsiyadan so'ng darhol bajariladi.

Ko'ngil ochish parkida aylanma yo'lda sayr qilishning o'xshashligi menga yoqdi: xabarlar navbatini sizni navbatdagi boshqa odamlar bilan navbatga qo'yadi, ish joyi - bu tez yurish chiptasi, u sizni tugatgandan so'ng darhol boshqa safarga chiqishga imkon beradi. oldingisi.

Masalan:

const bar = () => console.log ('bar')
const baz = () => console.log ('baz')
const foo = () => {
  konsol.log ('foo')
  setTimeout (bar, 0)
  yangi va'da ((hal qilish, rad qilish) =>
    шешу ('bazadan keyin, bardan oldin bo'lishi kerak')
  ) .then (solution => console.log (solution))
  baz ()
}
foo ()

Ushbu bosib chiqarish:

foo
baz
ko'pikdan keyin, bardan oldin bo'lishi kerak
bar

Bu va'dalar (va'da qilingan qurilgan asinx / kutish) va setTimeout () yoki boshqa platforma API orqali oddiy eski asinxron funktsiyalar o'rtasidagi katta farq.

Process.nextTick () ni tushunish

Node.js voqea qatorini tushunishga harakat qilayotganingizda, uning muhim qismlaridan biri bu process.nextTick (). Voqealar to'plami bilan maxsus tarzda o'zaro ta'sir qiladi.

Har safar voqealar to'plami to'liq sayohatni amalga oshirganda, biz buni "belgi" deb ataymiz.

Biz biron bir funktsiyani process.nextTick () -ga o'tkazganimizda, dvigatelga ushbu funktsiyani joriy operatsiya oxirida, keyingi voqea qatori boshlanishidan oldin chaqirishni buyuramiz:

process.nextTick (() => {
  //nimadir qil
})

Voqealar to'plami joriy funktsiya kodini qayta ishlash bilan band.

Ushbu operatsiya tugagach, JavaScript mexanizmi ushbu operatsiya davomida NextTick qo'ng'iroqlariga berilgan barcha funktsiyalarni bajaradi.

Shunday qilib, biz JavaScript tizimiga funktsiyani asxron holda (joriy funktsiyadan keyin) qayta ishlashni aytamiz, ammo imkon qadar tezroq navbatga qo'yib bo'lmaydi.

Chaqiruv setTimeout (() => {}, 0) funktsiyani keyingi satrda bajaradi, keyTick () ni ishlatishdan ancha kech.

Keyingi hodisada takroriy iteratsiyada ushbu kod allaqachon bajarilganligiga ishonch hosil qilmoqchi bo'lsangiz, NextTick () ni ishlating.

SetImmediate () ni tushunish

Agar kodning bir qismini sinxron ravishda bajarmoqchi bo'lsangiz, lekin imkon qadar tezroq variantlardan biri Node.js tomonidan ta'minlangan setImmediate () funktsiyasidan foydalanish:

setImmediate (() => {
  // biror narsani ishga tushirish
})

SetImmediate () argumenti sifatida qabul qilingan har qanday funktsiya - bu hodisa tsiklining keyingi iteratsiyasi bilan bajariladigan qayta qo'ng'iroq.

Qanday qilib SetImmediate () setTimeout (() => {}, 0) (0ms vaqtni uzatish) va process.nextTick () dan farq qiladi?

Process.nextTick () ga berilgan funktsiya, joriy operatsiya tugaganidan so'ng, voqea tsiklining joriy iteratsiyasi bo'yicha bajariladi. Bu har doim setTimeout () va setImmediate () dan oldin bajarilishini bildiradi.

0T kechikish bilan o'rnatilgan SetTimeout () qo'ng'irog'i setImmediate () ga juda o'xshash. Bajarish tartibi har xil omillarga bog'liq, ammo ularning ikkalasi ham voqea tsiklining keyingi iteratsiyasida ishlaydi.

Taymerlar

JavaScript kodini yozayotganda biron bir funktsiyaning bajarilishini kechiktirishni xohlashingiz mumkin. Kelajakda funktsiyalarni rejalashtirish uchun setTimeout () va setInterval () ni qanday ishlatishni bilib oling.

setTimeout ()

JavaScript kodini yozayotganda biron bir funktsiyaning bajarilishini kechiktirishni xohlashingiz mumkin. Bu setTimeoutning ishi.

Keyinchalik amalga oshirish uchun siz qo'ng'iroqni qaytarib chaqirish funktsiyasini va siz uni keyinchalik qancha ishlashini istagan qiymatni millisekundlarda belgilashingiz mumkin:

setTimeout (() => {
  // 2 soniyadan keyin ishlaydi
}, 2000)
setTimeout (() => {
  // 50 millisekunddan keyin ishlaydi
}, 50)

Ushbu sintaksis yangi funktsiyani belgilaydi. U erda siz istagan boshqa funktsiyalarga qo'ng'iroq qilishingiz yoki mavjud funktsiya nomi va parametrlar to'plamini o'tkazishingiz mumkin:

const myFunction = (firstParam, SecondParam) => {
  // nimadir qil
}
// 2 soniyadan keyin ishlaydi
setTimeout (myFunction, 2000, birinchiParam, ikkinchiParam)

setTimeout () taymer identifikatorini qaytaradi. Bu odatda ishlatilmaydi, lekin siz ushbu idni saqlashingiz va rejalashtirilgan funktsiyani bajarilishini o'chirishni xohlasangiz, uni o'chirib tashlashingiz mumkin:

const id = setTimeout (() => {
  // 2 soniyadan keyin ishlash kerak
}, 2000)
// fikrimni o'zgartirdim
clearTimeout (id)

Nolinchi kechikish

Agar siz kutish vaqtining kechikishini 0 ga belgilasangiz, qo'ng'iroqni qaytarish funktsiyasi iloji boricha tezroq bajariladi, ammo joriy funktsiya bajarilgandan so'ng:

setTimeout (() => {
  konsol.log ("keyin")
}, 0)
console.log ('oldin')

keyin chop etadi.

Bu ayniqsa protsessorni intensiv topshiriqlarga to'sqinlik qilmaslik va og'ir hisoblarni bajarishda boshqa funktsiyalarni jadvalga vazifalarni navbatga qo'yish orqali bajarilishini ta'minlash uchun foydalidir.

Ba'zi brauzerlar (IE va Edge) aynan shu funktsiyani bajaradigan setImmediate () usulini qo'llaydilar, ammo bu standart emas va boshqa brauzerlarda mavjud emas. Ammo bu Node.js-da standart vazifadir.

setInterval ()

setInterval () - bu farq bilan setTimeout () ga o'xshash funktsiya. Qo'ng'iroqni qaytarish funktsiyasini bir marta ishga tushirishning o'rniga, u belgilangan vaqt oralig'ida (millisekundlarda) bir umr ishlaydi.

setInterval (() => {
  // har 2 soniyada ishlaydi
}, 2000)

Yuqoridagi funktsiya har 2 sekundda ishlaydi, agar to'xtatish kerakligini aytmasangiz, clearInterval-dan foydalanib, uni setInterval qaytargan oraliq idishini topshirishingiz kerak:

const id = setInterval (() => {
  // har 2 soniyada ishlaydi
}, 2000)
clearInterval (id)

Qaytadan teskari qo'ng'iroq qilish funktsiyasi ichida clearInterval-ga qo'ng'iroq qilish odatiy hol bo'lib, uni qayta ishga tushirish yoki to'xtash kerakligini avtomatik aniqlashga imkon beradi. Masalan, agar ushbu App.somethingIWait qiymati kelmasa, ushbu kod ishlaydi.

const interval = setInterval (funktsiya () {
  if (App.somethingIWait === 'kelgan') {
    clearInterval (oraliq)
    // aks holda narsalar qilish
  }
}, 100)

Rekursiv setTimeout

setInterval har n millisekundlarda funktsiyani ishga tushiradi, funktsiya qachon bajarilishi haqida o'ylamasdan.

Agar funktsiya har doim bir xil vaqtni talab qilsa, barchasi yaxshi:

Balki funktsiya turli xil bajarish vaqtlarini olishi mumkin, masalan tarmoq shartlariga qarab:

Ehtimol, bitta uzoq ijro etilishi ikkinchisiga to'g'ri keladi:

Bunga yo'l qo'ymaslik uchun, teskari qo'ng'iroq qilish funktsiyasi tugashi bilan siz chaqiriladigan rekursiv setTimeout-ni rejalashtirishingiz mumkin:

const myFunction = () => {
  // nimadir qil
  setTimeout (myFunction, 1000)
}
setTimeout (
  myFunction ()
}, 1000)

ushbu stsenariyga erishish uchun:

setTimeout va setInterval Node.js-da, taymerlar moduli orqali mavjud.

Node.js shuningdek, asosan Node.js Event Loop bilan ishlashda ishlatiladigan setTimeout (() => {}, 0) dan foydalanishga teng bo'lgan setImmediate () ni taqdim etadi.

Asenkron dasturlash va qo'ng'iroqlar

Sukut bo'yicha JavaScript sinxron va bitta tishli hisoblanadi. Bu shuni anglatadiki, kod yangi oqimlarni yarata olmaydi va parallel ravishda ishlaydi.

Dasturlash tillarida asinxroniklik

Kompyuterlar dizayni bo'yicha asenkrondir.

Asenkron, narsalar asosiy dastur oqimidan mustaqil ravishda sodir bo'lishi mumkinligini anglatadi.

Hozirgi iste'molchi kompyuterlarda har bir dastur ma'lum bir vaqt oralig'ida ishlaydi va keyin boshqa dasturning ishlashini davom ettirishga imkon berish uchun u bajarilishini to'xtatadi. Bu narsa juda tez aylanadiki, buni sezish qiyin, va bizning kompyuterlarimiz bir vaqtning o'zida ko'plab dasturlarni ishlaydi, ammo bu xayoldir (ko'p protsessorli mashinalardan tashqari).

Dasturlar ichki e'tiborni tizimning e'tiborini qozonish uchun protsessorga uzatiladigan uzilishlardan foydalanadi.

Men uning ichki qismiga kirmayman, lekin shuni yodda tutingki, dasturlar asenkron bo'lishi odatiy holdir va diqqatni jalb qilish kerak bo'lguncha ularning bajarilishini to'xtatib turing va shu vaqtning o'zida kompyuter boshqa narsalarni ham bajarishi mumkin. Dastur tarmoqdan javob kutayotganida, u so'rov tugaguncha protsessorni to'xtata olmaydi.

Odatda, dasturlash tillari sinxron bo'lib, ba'zilari tilda yoki kutubxonalarda asinxronikni boshqarish usulini ta'minlaydi. C, Java, C #, PHP, Go, Ruby, Swift, Python, ularning barchasi sukut bo'yicha sinxrondir. Ulardan ba'zilari yangi jarayonning yumshatilishidan iplar yordamida asinxronikani engishadi.

JavaScript

Sukut bo'yicha JavaScript sinxron va bitta tishli hisoblanadi. Bu shuni anglatadiki, kod yangi oqimlarni yarata olmaydi va parallel ravishda ishlaydi.

Kod qatorlari ketma-ket, ketma-ket bajariladi.

Masalan:

const a = 1
const b = 2
const c = a * b
konsol.log (c)
nimadir qil()

Ammo JavaScript brauzer ichida tug'ilgan. Dastlab uning asosiy vazifasi foydalanuvchilarning onClick, onMouseOver, onChange, onSubmit va boshqalar kabi harakatlariga javob berish edi. Buni sinxron dasturlash modeli yordamida qanday amalga oshirish mumkin?

Javob uning muhitida edi. Brauzer ushbu turdagi funktsiyalarni bajaradigan API to'plamini taqdim etish orqali buni amalga oshirish usulini taqdim etadi.

Yaqinda Node.js ushbu kontseptsiyani faylga kirish, tarmoq qo'ng'iroqlari va hokazolarni kengaytirish uchun blokirovka qilinmaydigan I / O muhitini taqdim etdi.

Qo'ng'iroqlar

Foydalanuvchi qachon tugmani bosishni bilmasligingiz mumkin, shuning uchun nima qilish kerakligini klik qilish voqeasi uchun ishlov beruvchini aniqlang.

Ushbu voqea ishlovchisi voqea tetiklanganda chaqiriladigan funktsiyani qabul qiladi:

document.getElementById ('tugmasi'). addEventListener ('chertish', () => {
  // element bosildi
})

Bu "qayta chaqirish" deb nomlangan.

Qayta qo'ng'iroq qilish - bu boshqa funktsiyaga qiymat sifatida berilgan oddiy funktsiya va faqat voqea sodir bo'lganda bajariladi. Biz buni qila olamiz, chunki JavaScript-da birinchi darajali funktsiyalar mavjud bo'lib, ular o'zgaruvchiga tayinlanishi va boshqa funktsiyalarga o'tishi mumkin (yuqori tartibli funktsiyalar deb ataladi).

Barcha mijoz kodingizni sahifa tayyor bo'lganda qo'ng'iroqni qaytarish funktsiyasini bajaradigan oyna ob'ekti yuklovchi voqea tinglovchilariga o'rash odatiy holdir:

windows.addEventListener ('yuklash', () => {
  // oyna yuklandi
  // xohlaganingizni qiling
})

Callback-lar nafaqat DOM tadbirlarida, balki hamma joyda qo'llaniladi.

Bitta oddiy misol, taymerlardan foydalanish:

setTimeout (() => {
  // 2 soniyadan keyin ishlaydi
}, 2000)

XHR so'rovlari, shuningdek, ushbu misolda ma'lum bir voqea sodir bo'lganda chaqiriladigan xususiyatga funktsiyani tayinlash orqali qayta qo'ng'iroqni qabul qiladi (bu holda so'rovning holati o'zgaradi):

const xhr = yangi XMLHttpRequest ()
xhr.onreadystatechange = () => {
  if (xhr.readyState === 4) {
    xhr.status === 200? console.log (xhr.responseText): konsol.error ('xato')
  }
}
xhr.open ('olish', 'https://yoursite.com')
xhr.send ()

Qo'ng'iroqlarni qabul qilishda xatolar

Qo'ng'iroqlar bilan bog'liq xatolarni qanday hal qilasiz? Juda keng tarqalgan strategiyalardan biri Node.js tomonidan qabul qilingan narsalardan foydalanishdir: har qanday qo'ng'iroqni qaytarish funktsiyasidagi birinchi parametr xato ob'ekti - birinchi xato qaytarib yuborish.

Agar xato bo'lmasa, ob'ekt nolga teng. Agar xato bo'lsa, unda xatoning ba'zi tavsifi va boshqa ma'lumotlar mavjud.

fs.readFile ('/ file.json', (xato, ma'lumotlar) => {
  if (err! == null) {
    // ishlov berish xatosi
    konsol.log (xato)
    qaytish
  }
  // xatolar yo'q, ma'lumotlarni qayta ishlash
  konsol.log (ma'lumotlar)
})

Qo'ng'iroqlar bilan bog'liq muammo

Qo'ng'iroqlar oddiy holatlar uchun juda yaxshi!

Biroq, har bir qo'ng'iroqni qaytarish uyasi darajasini qo'shadi. Agar sizda juda ko'p qo'ng'iroq bo'lsa, kod juda tez murakkablashadi:

windows.addEventListener ('yuklash', () => {
  document.getElementById ('tugmasi'). addEventListener ('chertish', () => {
    setTimeout (() => {
      items.forEach (element => {
        // sizning kodingiz bu erda
      })
    }, 2000)
  })
})

Bu shunchaki 4 darajali oddiy kod, lekin men juda ko'p joylashishni ko'rdim va bu juda ham qiziqarli emas.

Buni qanday hal qilamiz?

Qo'ng'iroqlarni amalga oshirish uchun alternativalar

ES6-dan boshlab, JavaScript-ga qo'ng'iroqlarni amalga oshirishni o'z ichiga olmaydigan asinxron kodni yaratishda yordam beradigan bir nechta xususiyatlar kiritildi:

  • Va'dalar (ES6)
  • Asinx / Kutish (ES8)

Va'dalar

Va'dalar - bu sizning kodingizda juda ko'p qo'ng'iroqlarni yozmasdan JavaScript-dagi asinxron kod bilan shug'ullanishning bir usuli.

Va'dalar bilan tanishish

Va'da odatda oxir-oqibat mavjud bo'ladigan qiymat uchun proksi sifatida belgilanadi.

Yillar davomida bo'lishiga qaramay, ular ES2015-da standartlashtirildi va joriy etildi va endi ular ES2017-da async funktsiyalari bilan almashtirildi.

Async funktsiyalari va'da qilingan API-ni qurilish bloki sifatida ishlatadilar, shuning uchun ularni tushunish juda muhimdir, hatto yangi kodda siz va'dalar o'rniga async funktsiyalaridan foydalanishingiz mumkin.

Va'dalar qanday ishlaydi, qisqasi

Va'da qilinganidan so'ng, u kutilayotgan holatda boshlanadi. Bu shuni anglatadiki, qo'ng'iroq qiluvchining funktsiyasi bajarilishini davom ettiradi, va u o'z-o'zidan ishlashni amalga oshirishni kutadi va qo'ng'iroq qiluvchiga ba'zi bir fikrlarni beradi.

Shu paytda, chaqiruvchi funktsiya undan va'da qilingan vaziyatni yoki rad etilgan holatda qaytarilishini kutadi, lekin siz bilganingizdek, JavaScript asinxrondir - shuning uchun funktsiya va'da bajarilayotganda funktsiya bajarilishini davom ettiradi.

Qaysi JS API va'da beradi?

O'zingizning shaxsiy kodingiz va kutubxonalar kodidan tashqari, va'dalar standart zamonaviy Internet API-lar tomonidan ishlatiladi, masalan:

  • batareya API
  • Fetch API
  • Xizmat ishchilari

Zamonaviy JavaScript-da va'dalardan foydalanmayotganligingiz ehtimoldan yiroq, shuning uchun ularga sho'ng'ishni boshlaylik.

Va'da yaratish

Promise API yangi Promise () yordamida boshlagan Promise konstruktorini ochib beradi:

qilaylik = true
const isItDoneYet = yangi va'da (
  (hal qilish, rad qilish) => {
    agar (bajarilgan bo'lsa) {
      const workDone = 'Mana men qurgan narsa'
      hal qilish (workDone)
    } else {
      const why = 'Hali ham boshqa narsa ustida ishlayapman'
      rad qilish (nega)
    }
  }
)

Ko'rinib turibdiki, va'da bajarilgan global doimiylikni tekshiradi va agar bu rost bo'lsa, biz qat'iy qarorni qaytaramiz, aks holda rad etilgan va'da.

Qat'iylik va rad etishdan foydalanib, biz qiymatni qaytarishimiz mumkin, yuqoridagi holatda biz faqat satrni qaytaramiz, ammo u ham ob'ekt bo'lishi mumkin.

Va'da berish

So'nggi bo'limda biz qanday qilib va'da qanday yaratilishini tanishtirdik.

Endi va'da qanday bajarilishi yoki ishlatilishi mumkinligini ko'rib chiqaylik:

const isItDoneYet = yangi va'da (
  // ...
)
const checkIfItsDone = () => {
  isItDoneYet
    .then ((ok) => {
      konsol.log (ok)
    })
    .catch ((err) => {
      konsol.error (xato)
    })
}

CheckIfItsDone () -ni ishga tushirish isItDoneYet () va'dasini bajaradi va uning orqaga qaytarib yuborilgan qo'ng'irog'idan foydalanib, hal qilinishini kutadi, agar xato bo'lsa, uni qayta qo'ng'iroq qilish paytida ishlatadi.

Zanjirli va'dalar

Va'dalar zanjirini yaratib, boshqa va'daga qaytarilishi mumkin.

Zanjirli va'dalarga zo'r misol Fetch API bo'lib, XMLHttpRequest API ustki qatlami bo'lib, biz manbani olish va manbani olishda bajariladigan va'dalar zanjirini navbatga qo'yish uchun foydalanishimiz mumkin.

Fetch API - bu va'daga asoslangan mexanizm va fetch () ni chaqirish yangi Promise () yordamida o'z va'damizni aniqlashga tengdir.

Zanjirli va'dalarga misol

const holati = (javob) => {
  if (answer.status> = 200 && javob.status <300) {
    return Promise.resolve (javob)
  }
  return Promise.reject (yangi xato (javob.statusText))
}
const json = (javob) => javob.json ()
olish ('/ todos.json')
  .then (status)
  .then (json)
  .then ((data) => {console.log ('Talab JSON javobi bilan muvaffaqiyatli chiqdi', ma'lumotlar)})
  .catch ((xato) => {console.log ('Talab bo'lmadi', xato)})

Ushbu misolda biz domen ildizida joylashgan todos.json faylidan TODO elementlari ro'yxatini olish uchun fetch () deb nomlaymiz va va'dalar zanjirini yaratamiz.

Runch fetch () juda ko'p xususiyatlarga ega bo'lgan javobni qaytaradi va biz murojaat qilganlar ichida:

  • status, HTTP holat kodini ko'rsatadigan raqamli qiymat
  • statusText, so'rov muvaffaqiyatli amalga oshirilgan bo'lsa, maqbul bo'lgan xabar

javob shuningdek, json () usuliga ega, u qayta ishlangan va JSON-ga aylantirilgan tanadagi tarkib bilan bog'liq bo'lgan va'da beradi.

Shunday qilib, ushbu binolarni hisobga olgan holda, bu shunday bo'ladi: zanjirda birinchi va'da - bu biz belgilagan funktsiya, status () deb nomlangan bo'lib, u javob holatini tekshiradi va agar u (200 dan 299 gacha) javob bo'lmasa, u rad etadi. va'da.

Ushbu operatsiya va'da zanjirida ko'rsatilgan barcha zanjirli va'dalarni o'tkazib yuborishga olib keladi va to'g'ridan-to'g'ri pastki qismida joylashgan () so'roviga xato xabari bilan birga so'rov bajarilmagan matni yozib oladi.

Buning o'rniga u biz belgilagan json () funktsiyasini chaqiradi. Oldingi va'da muvaffaqiyatli bo'lib, javob ob'ektini qaytarganligi sababli, biz uni ikkinchi va'daga kirish sifatida olamiz.

Bunday holda, biz JSON tomonidan qayta ishlangan ma'lumotlarni qaytaramiz, shuning uchun uchinchi va'da JSON-ni to'g'ridan-to'g'ri oladi:

.then ((ma'lumotlar) => {
  console.log ('So'rov JSON javobi bilan muvaffaqiyatli bajarildi', ma'lumotlar)
})

va biz uni faqat konsolga kiritamiz.

Xatolarni qayta ishlash

Misolda, oldingi bo'limda, biz va'dalar zanjiriga qo'shilgan ushlangan edik.

Va'dalar zanjiridagi biron bir narsa bajarilmasa va xato yuzaga kelsa yoki va'dani rad etsa, nazorat zanjirni eng yaqin tutish () buyrug'iga o'tadi.

yangi va'da ((hal qilish, rad qilish) => {
  yangi xatoni tashlash ('Xato')
})
  .catch ((err) => {console.error (err)})
// yoki
yangi va'da ((hal qilish, rad qilish) => {
  rad qilish ('Xato')
})
  .catch ((err) => {console.error (err)})

Kaskad xatolar

Agar catch () ichida siz xato qilsangiz, uni boshqarish uchun ikkinchi tutqichni () qo'shishingiz mumkin va hokazo.

yangi va'da ((hal qilish, rad qilish) => {
  yangi xatoni tashlash ('Xato')
})
  .catch ((err) => {yangi xato tashlash ('Xato')})
  .catch ((err) => {console.error (err)})

Orkestrlashtirish va'dalari

Promise.all ()

Agar siz turli xil va'dalarni sinxronlashtirishingiz kerak bo'lsa, Promise.all () sizga va'dalar ro'yxatini aniqlashga va ular barchasi hal bo'lgandan keyin bajarishga yordam beradi.

Masalan:

const f1 = olish ('/ narsa.json')
const f2 = olish ('/ narsa2.json')
Promise.all ([f1, f2]) va keyin ((res) => {
    console.log ('Natijalar qatori', res)
})
.catch ((err) => {
  konsol.error (xato)
})

ES2015 buzuvchi tayinlash sintaksisi sizga quyidagilarni bajarishga imkon beradi:

Promise.all ([f1, f2]) va keyin (([res1, res2]) => {
    console.log ('Natijalar', res1, res2)
})

Albatta, siz zinapoyadan foydalanish bilan cheklanmaysiz, har qanday va'dalarni bajarish yaxshi.

Promise.race ()

Promise.race () siz bergan va'dalarning birinchisi hal bo'lganda ishlaydi va birinchi va'da natijasi bajarilgan holda bir marta takrorlangan chaqiruvni amalga oshiradi.

Masalan:

const birinchi = yangi va'da ((hal qilish, rad qilish) => {
    setTimeout (hal qilish, 500, "birinchi")
})
const Second = yangi va'da ((hal qilish, rad qilish) => {
    setTimeout (hal qilish, 100, "ikkinchi")
})
Promise.race ([birinchi, ikkinchi]) va keyin ((natija) => {
  console.log (natija) // ikkinchi
})

Umumiy xato, Uncaught TypeError: aniqlanmagan va'da emas

Agar siz Uncaught TypeError-ni olsangiz: aniqlanmagan - bu konsolda va'da qilingan xato emas, shunchaki Promise () o'rniga yangi Promise () ni ishlatganingizga ishonch hosil qiling.

Async va kuting

JavaScript-da asenkron funktsiyalarga zamonaviy yondashuvni o'rganing.

JavaScript juda qisqa vaqt ichida chaqiruv qo'ng'irog'idan va'dalarga qadar (ES2015) rivojlandi va ES2017 asinxron JavaScript async / kutish sintaksisi bilan yanada sodda bo'ldi.

Async funktsiyalari va'dalar va generatorlar kombinatsiyasidir va asosan ular va'dalarga nisbatan yuqori darajadagi mavhumlikdir. Takror aytayin: async / kutish va'dalarga asoslanadi.

Nega async / kutish joriy etildi?

Ular qozon plitalarini va'dalar atrofida kamaytiradi va "zanjirni buzmang" cheklovlar va'dalarini cheklaydi.

ES2015-da va'da berilganda, ular asinxron kod bilan bog'liq muammoni hal qilish uchun mo'ljallangan edi va ular shunday qilishdi, lekin ES2015 va ES2017-ni ajratib turadigan 2 yil ichida va'dalar yakuniy echim bo'lolmasligi aniq edi.

Qayta qo'ng'iroq qilish do'zaxining mashhur muammosini hal qilish uchun va'da berildi, ammo ular o'zlari va sintaksis murakkabligi bilan tanishdilar.

Ular ishlab chiqaruvchilarga yaxshiroq sintaksis ochilishi mumkin bo'lgan yaxshi ibtidoiy narsalar edi, shuning uchun vaqt to'g'ri kelganida biz async funktsiyalariga ega bo'ldik.

Ular kodni sinxron ko'rinishga o'xshaydi, ammo u parda orqasida asenkron emas va bloklanmagan.

U qanday ishlaydi

Async funktsiyasi, ushbu misolda berilganidek, so'zni qaytaradi:

const doSomethingAsync = () => {
    yangi va'da berish ((qaror) => {
        setTimeout (() => шешу ('Men biror narsa qildim'), 3000)
    })
}

Agar siz ushbu funktsiyani chaqirishni xohlasangiz, kutasiz, va qo'ng'iroq kodi va'da bekor qilinmaguncha yoki rad etilmaguncha to'xtaydi. Bitta ogohlantirish: mijoz funktsiyasi asinx sifatida aniqlanishi kerak.

Bunga misol:

const doSomething = async () => {
    console.log (doSomethingAsync () ni kuting)
}

Qisqa misol

Bu asinxron funktsiyani ishlatish uchun ishlatiladigan async /aitning oddiy namunasidir:

const doSomethingAsync = () => {
    yangi va'da berish ((qaror) => {
        setTimeout (() => шешу ('Men biror narsa qildim'), 3000)
    })
}
const doSomething = async () => {
    console.log (doSomethingAsync () ni kuting)
}
console.log ('oldin')
nimadir qil()
console.log ('Keyin')

Yuqoridagi kod brauzer konsoliga quyidagilarni bosib chiqaradi:

Oldin
Keyin
Men nimadir qildim // 3-dan keyin

Hamma narsaga va'da bering

Async kalit so'zini istalgan funktsiyaga kiritish, funktsiya va'da berishini anglatadi.

Agar bu aniq amalga oshirilmasa ham, u ichkariga qaytarib berishni va'da qiladi.

Shuning uchun ushbu kod amal qiladi:

const aFunction = async () => {
  qaytish 'sinov'
}
aFunction (). keyin (ogohlantirish) // Bu "sinov" haqida ogohlantiradi

va bir xil:

const aFunction = async () => {
  return Promise.resolve ('sinov')
}
aFunction (). keyin (ogohlantirish) // Bu "sinov" haqida ogohlantiradi

Kodni o'qish juda sodda

Yuqoridagi misolda ko'rib turganingizdek, bizning kodimiz juda sodda ko'rinadi. Uni zanjirlash va qo'ng'iroqni qaytarish funktsiyalari yordamida aniq va'dalar yordamida kod bilan taqqoslang.

Va bu juda oddiy misol, kod ancha murakkabroq bo'lganda katta foyda olinadi.

Masalan, JSON-ning manbasini qanday qilib va'da qilib, uni tahlil qilish haqida:

const getFirstUserData = () => {
  return fetch ('/ users.json') // foydalanuvchilar ro'yxatini olish
    .then (javob => javob.json ()) // JSON tahlili
    .then (users => users [0]) // birinchi foydalanuvchini tanlang
    .then (user => olish (`/ users / $ {user.name}`)) // foydalanuvchi ma'lumotlarini olish
    .then (userResponse => response.json ()) // JSON tahlili
}
getFirstUserData ()

Va bu erda wait / async-dan foydalanilgan bir xil funktsiyalar mavjud:

const getFirstUserData = async () => {
  const javobi = kuting ('/ users.json') // foydalanuvchilar ro'yxatini oling
  const users = Javobni kuting.json () // JSON tahlili
  const user = users [0] // birinchi foydalanuvchini tanlang
  const userResponse = kutish (`/ users / $ {user.name}`) // foydalanuvchi ma'lumotlarini olish
  const userData = user.json () kuting JSON tahlil qiling
  userData-ni qaytaring
}
getFirstUserData ()

Seriyadagi bir nechta asinx funktsiyalari

asinx funktsiyalarini osonlikcha zanjirlash mumkin, va sintaksis oddiy va'dalarga qaraganda ancha oson o'qiladi:

const wordToDoSomething = () => {
    yangi va'da bering (qaror => {
        setTimeout (() => шешу ('Men biror narsa qildim'), 10000)
    })
}
const watchOverSomeoneDoingSomething = async () => {
    const narsa = va'dani kutingDoSomething ()
    biror narsani qaytaring + 'va men tomosha qildim'
}
const watchOverSomeoneWatchingSomeoneDoingSomething = async () => {
    const narsa = kuzatishni kutingOverSomeoneDoingSomething ()
    bir narsani qaytaring + 'va men ham tomosha qildim'
}
watchOverSomeoneWatchingSomeoneDoingSomething (). keyin ((res) => {
    konsol.log (res)
})

Chop etadi:

Men nimadir qildim, men ham tomosha qildim va men ham tomosha qildim

Nosozliklarni tuzatish osonroq

Nosozliklarni tuzatish va'dalari qiyin, chunki tuzatuvchi asinxron kodni o'zgartirmaydi.

async /ait kutish buni juda osonlashtiradi, chunki kompilyator uchun xuddi sinxron kod kabi.

Node.js voqea tarqatuvchisi

Siz Node.js-da maxsus hodisalar bilan ishlashingiz mumkin.

Agar siz brauzerda JavaScript bilan ishlagan bo'lsangiz, foydalanuvchining o'zaro munosabatlari voqealar orqali qanday amalga oshirilishini bilasiz: sichqonchani bosish, klaviaturani bosish, sichqoncha harakatlariga reaktsiya va hk.

Orqa tomonda Node.js bizga voqealar moduli yordamida shunga o'xshash tizimni yaratish imkoniyatini taklif etadi.

Ushbu modul, xususan, tadbirlarni boshqarish uchun foydalanadigan EventEmitter sinfini taklif etadi.

Buni quyidagicha ishga tushirasiz:

const eventEmitter = zarur ('voqealar'). EventEmitter ()

Ushbu ob'ekt, aksariyat qatorlarda, yoqish va chiqarish usullarini ochib beradi.

  • chiqindilar voqeani qo'zg'atish uchun ishlatiladi
  • voqea tetiklantirilganda bajariladigan orqaga qaytish funktsiyasini qo'shish uchun ishlatiladi

Masalan, boshlang'ich hodisani yarataylik va namunani taqdim etish uchun biz bunga konsolga kirish orqali javob beramiz:

eventEmitter.on ('boshlash', () => {
  console.log ('boshlandi')
})

Ishlayotganimizda:

eventEmitter.emit ('boshlash')

Hodisalarni qayta ishlash funktsiyasi ishga tushirildi va biz konsol jurnalini olamiz.

Voqealarni qayta ishlov beruvchiga argumentlarni ularni chiqarish uchun qo'shimcha dalillar sifatida berishingiz mumkin:

eventEmitter.on ('boshlash', (raqam) => {
  console.log (`$ {number}` boshlandi)
})
eventEmitter.emit ('boshlash', 23)

Bir nechta dalillar:

eventEmitter.on ('boshlash', (boshlash, tugatish) => {
  console.log (`$ {start} dan $ {end}` gacha boshlandi)
})
eventEmitter.emit ('boshlash', 1, 100)

EventEmitter ob'ekti shuningdek hodisalar bilan o'zaro aloqada bo'lish uchun boshqa usullarni ham ochadi, masalan:

  • marta (): bir martalik tinglovchini qo'shish
  • removeListener () / off (): voqea tinglovchisini voqeadan olib tashlash
  • removeAllListeners (): tadbir uchun barcha tinglovchilarni olib tashlash

HTTP so'rovlari qanday ishlaydi

Brauzerga URL-ni boshidan oxirigacha yozganda nima bo'ladi?

Ushbu bo'limda brauzerlar HTTP / 1.1 protokoli yordamida sahifa so'rovlarini qanday bajarishlarini tasvirlaydi.

Agar siz biron-bir intervyu o'tkazgan bo'lsangiz, sizdan: "Google qidiruv maydonchasiga biror narsa kiritib, enter ni bosganingizda nima bo'ladi?" Degan savol tug'ilishi mumkin.

Bu sizga beriladigan eng mashhur savollardan biridir. Odamlar shunchaki ba'zi bir asosiy tushunchalarni tushuntirib bera olasizmi va Internet qanday ishlashi haqida biron bir savolingiz borligini bilishni xohlashadi.

Ushbu bo'limda brauzeringizning manzil satriga URL kiriting va enter tugmasini bosganingizda nima sodir bo'lishini tahlil qilaman.

Ushbu qo'llanmada muhokama qilish juda qiziq mavzu, chunki u men alohida maqolalarda ko'rib chiqishim mumkin bo'lgan ko'plab texnologiyalarga tegishli.

Bu juda kamdan-kam o'zgaradigan texnologiya va odamlar tomonidan qurilgan eng murakkab va keng ekotizimlardan biriga aylantiradigan texnologiyalar.

HTTP protokoli

Men faqat URL so'rovlarini tahlil qilaman.

Zamonaviy brauzerlar sizning manzillar satrida yozgan narsalaringiz haqiqiy URL manzili yoki qidiruv atamasi ekanligini bilish qobiliyatiga ega va agar u URL manzili bo'lmasa, standart qidiruv tizimidan foydalanadi.

Haqiqiy URL manzilini kiritasiz deb o'ylayman.

URL manzilini kiritib, Enter tugmachasini bosganingizda brauzer avval to'liq URL manzilini yaratadi.

Agar siz hozirgina flaviocopes.com kabi domenni kiritgan bo'lsangiz, brauzer sukut bo'yicha HTTP: // ni oladi, HTTP protokoli uchun.

Ishlar MacOS / Linux bilan bog'liq

Faqat FYI. Windows ba'zi narsalarni biroz boshqacha qilishi mumkin.

DNS qidirish bosqichi

Serverning IP manzilini olish uchun brauzer DNS qidirishni boshlaydi.

Domen nomi biz uchun odamlar uchun qulay yorliqdir, ammo Internet shunday tuzilganki, kompyuterlar 222.324.3.1 (IPv4) kabi raqamlar to'plami bo'lgan IP-manzili orqali serverning aniq manzilini topishlari mumkin.

Birinchidan, domen yaqinda hal qilinganligini bilish uchun DNS mahalliy keshini tekshiradi.

Ushbu URL-da ko'rishingiz mumkin bo'lgan qulay DNS kesh vizualizatori mavjud: chrome: // net-internals / # dns (nusxa ko'chiring va uni Chrome brauzerining manzillar paneliga joylashtiring)

Agar u erda hech narsa topilmasa, brauzer host ma'lumotlarini olish uchun POSIX tizim qo'ng'irog'idan foydalanib, DNS echuvchisidan foydalanadi.

gethostbyname

gethostbyname avval MacOS yoki Linux-da / etc / hosts-da joylashgan mahalliy xostlar faylida tizimning mahalliy ma'lumot bilan ta'minlanganligini tekshirish uchun ko'rinadi.

Agar bu domen haqida hech qanday ma'lumot bermasa, tizim DNS serveriga so'rov yuboradi.

DNS serverning manzili tizim afzalliklarida saqlanadi.

Bular ikkita mashhur DNS serverlar:

  • 8.8.8.8: Google umumiy DNS serveri
  • 1.1.1.1: CloudFlare DNS-server

Aksariyat odamlar Internet-provayderi tomonidan taqdim etilgan DNS-serverdan foydalanadilar.

Brauzer UDP protokoli yordamida DNS so'rovini bajaradi.

TCP va UDP kompyuter tarmog'ining asosli protokollaridan ikkitasi. Ular bir xil kontseptual darajada o'tirishadi, lekin TCP ulanishga yo'naltirilgan, UDP esa ulanishsiz protokol bo'lib, engilroq, xabarlarni yuborish uchun ishlatiladi.

UDP so'rovining qanday bajarilishi ushbu qo'llanmada mavjud emas.

DNS server keshda IP domeni bo'lishi mumkin. Bu emas, u ildiz DNS-serverni so'raydi. Bu butun Internetni boshqaradigan tizim (13 ta haqiqiy serverlardan iborat, butun dunyo bo'ylab tarqatilgan).

DNS serveri sayyoradagi har bir domen nomining manzilini bilmaydi.

U eng yuqori darajadagi DNS rezervlari qaerdaligini biladi.

Yuqori darajadagi domen bu domen kengaytmasi: .com, .it, .pizza va boshqalar.

Ildiz DNS server so'rovni qabul qilgandan so'ng, u so'rovni yuqori darajadagi domenga (TLD) yuboradi.

Siz flaviocopes.com saytini qidiryapsiz deb ayting. Ildiz domeni DNS serveri .com TLD serverining IP-manzilini qaytaradi.

Endi bizning DNS hal qiluvchimiz o'sha TLD serverining IP-keshini keshlaydi, shuning uchun buning uchun yana DNS-serverni so'rash shart emas.

TLD DNS serveri biz izlayotgan domen uchun vakolatli Name Serverlarining IP-manzillariga ega bo'ladi.

Qanday? Domenni sotib olganingizda, domen registratori tegishli TDL ism serverlarini yuboradi. Ism serverlarini yangilaganingizda (masalan, hosting provayderini o'zgartirganda), ushbu ma'lumot sizning domen registratoringiz tomonidan avtomatik ravishda yangilanadi.

Bular hosting-provayderning DNS-serverlari. Zaxira sifatida foydalanish uchun ular odatda 1 dan ortiq.

Masalan:

  • ns1.dreamhost.com
  • ns2.dreamhost.com
  • ns3.dreamhost.com

DNS hal qiluvchisi birinchisidan boshlanadi va siz qidirayotgan domen IP-ni (subdomain bilan ham) so'rashga harakat qiladi.

Bu IP-manzil uchun haqiqiy haqiqat manbai.

Endi bizda IP manzilimiz bor ekan, biz sayohatni davom ettirishimiz mumkin.

TCP so'rovini qo'lda o'tkazish

Serverning IP-manzili mavjud bo'lsa, endi brauzer unga TCP ulanishni boshlashi mumkin.

TCP ulanishi to'liq ishga tushirilgunga qadar biroz qo'lda ishlashni talab qiladi va siz ma'lumotlarni yuborishni boshlashingiz mumkin.

Aloqa o'rnatilgandan so'ng, biz so'rovni yuborishimiz mumkin

So‘rov yuborilmoqda

So'rov aloqa protokoli tomonidan aniq belgilangan tarzda tuzilgan oddiy matnli hujjatdir.

U 3 qismdan iborat:

  • so'rov qatori
  • so'rov sarlavhasi
  • so'rov organi

Talab qatori

Talablar qatori bitta satrda o'rnatiladi:

  • HTTP usuli
  • resurs manzili
  • protokol versiyasi

Masalan:

GET / HTTP / 1.1

Talab sarlavhasi

Talab sarlavhasi bu maydon to'plami: ma'lum qiymatlarni o'rnatgan qiymat juftlari.

Ikkita majburiy maydonlar mavjud, ulardan biri Xost, ikkinchisi - Aloqa, qolgan barcha maydonlar ixtiyoriy:

Xost: flaviocopes.com
Ulanish: yoping

Host, biz yo'naltirmoqchi bo'lgan domen nomini bildiradi, lekin ulanish doim ochiq bo'lishi kerak bo'lsa, Ulanish har doim yopiq bo'ladi.

Eng ko'p ishlatiladigan sarlavhalar:

  • Kelib chiqishi
  • Qabul qiling
  • Qabul qilish-kodlash
  • Cookie
  • Keshni boshqarish
  • Dnt

ammo yana ko'plari mavjud.

Sarlavha qismi bo'sh chiziq bilan tugaydi.

So‘rov asosiy qismi

Talablar qismi ixtiyoriydir, GET so'rovlarida ishlatilmaydi, lekin POST so'rovlarida va ba'zan boshqa fe'llarda juda ko'p ishlatiladi va unda JSON formatidagi ma'lumotlar bo'lishi mumkin.

Biz endi GET so'rovini tahlil qilyapmiz, chunki tanasi bo'sh va biz unga ko'proq qaramaymiz.

Javob

Talab yuborilgandan so'ng, server uni qayta ishlaydi va javobni yuboradi.

Javob holat kodi va status xabari bilan boshlanadi. Agar so'rov muvaffaqiyatli bo'lsa va 200 ni qaytarsa, u quyidagicha boshlanadi:

200 OK

So'rov boshqa holatlar kodi va xabarni yuborishi mumkin, bular singari:

404 topilmadi
403 man etilgan
301 doimiy ravishda ko'chirildi
500 ichki server xatosi
304 O'zgartirilmagan
401 ruxsatsiz

Javobda HTTP sarlavhalari va javoblar ro'yxati mavjud (biz brauzerda so'rovni bajarayotganimiz uchun HTML bo'ladi).

HTML-ni tahlil qiling

Endi brauzer HTML-ni qabul qildi va uni tahlil qilishni boshlaydi va sahifada talab qilingan barcha manbalar uchun bajarilmagan aniq jarayonni takrorlaydi.

  • CSS fayllari
  • rasmlar
  • favikon
  • JavaScript fayllari

Keyin brauzerlar sahifani qanday chiqaradi, lekin men tasvirlab bergan jarayon shunchaki HTML sahifalari uchun emas, balki HTTP orqali xizmat ko'rsatiladigan har qanday element uchun ekanligini tushunish muhimdir.

Node.js bilan HTTP serverini yarating

Mana, kirish qismida Node.js Hello World dasturi sifatida foydalangan HTTP veb-server:

const http = zarur ('http')
const porti = 3000
const server = http.createServer ((req, res) => {
  res.statusCode = 200
  res.setHeader ('Tarkib turi', 'matn / tekis')
  res.end ('Salom Dunyo \ n')
})
server.listen (port, () => {
  console.log (`Server http: // $ {hostname}: $ {port} /` da ishlamoqda)
})

Qisqacha tahlil qilaylik. Biz http modulini o'z ichiga olamiz.

Biz moduldan HTTP serverini yaratish uchun foydalanamiz.

Server belgilangan portda tinglash uchun o'rnatildi, 3000. Server tayyor bo'lgach, listback qaytarib berish funktsiyasi chaqiriladi.

Qaytarib qo'nadigan orqaga qaytarish funktsiyasi har bir kelgan har bir so'rov bo'yicha bajariladigan vazifadir. Har safar yangi so'rov qabul qilinganda, ikkita ob'ektni: so'rov (http.IncomingMessageobject) va javob (anketa) bilan ta'minlangan holda so'rov voqeasi chaqiriladi. http.ServerResponseobject).

request so'rov tafsilotlarini taqdim etadi. U orqali biz so'rov sarlavhalariga va so'rov ma'lumotlariga kiramiz.

javob mijozga qaytadigan ma'lumotni to'plash uchun ishlatiladi.

Bunday holda:

res.statusCode = 200

Biz muvaffaqiyatli javobni ko'rsatish uchun statusCode xususiyatini 200 ga o'rnatdik.

Kontent turi sarlavhasini ham o'rnatdik:

res.setHeader ('Tarkib turi', 'matn / tekis')

va biz javobni yopamiz va tugatish uchun argument sifatida tarkibni qo'shamiz:

res.end ('Salom Dunyo \ n')

Node.js bilan HTTP so'rovlarini bajarish

Node.js bilan HTTP so'rovlarini GET, POST, PUT va DELETE yordamida qanday bajarish kerak.

Men HTTP atamasini ishlataman, lekin HTTPS hamma joyda qo'llanilishi kerak bo'lgan narsadir, shuning uchun bu misollar HTTP o'rniga HTTPS dan foydalanadi.

GET so'rovini bajaring

const https = zarur ('https')
const parametrlari = {
  xost nomi: 'flaviocopes.com',
  port: 443,
  yo'l: '/ todos',
  usul: 'GET'
}
const req = https.request (variantlar, (res) => {
  console.log (`statusCode: $ {res.statusCode}`)
  res.on ('ma'lumotlar', (d) => {
    process.stdout.write (d)
  })
})
req.on ('xato', (xato) => {
  konsol.error (xato)
})
req.end ()

POST so'rovini bajaring

const https = zarur ('https')
const data = JSON.stringify ({
  todo: 'sut sotib oling'
})
const parametrlari = {
  xost nomi: 'flaviocopes.com',
  port: 443,
  yo'l: '/ todos',
  usul: 'POST',
  sarlavhalar: {
    'Content-Type': 'application / json',
    "Kontent uzunligi": data.length
  }
}
const req = https.request (variantlar, (res) => {
  console.log (`statusCode: $ {res.statusCode}`)
  res.on ('ma'lumotlar', (d) => {
    process.stdout.write (d)
  })
})
req.on ('xato', (xato) => {
  konsol.error (xato)
})
req.write (ma'lumotlar)
req.end ()

PUT va O'chirish

PUT va DELETE so'rovlari bir xil POST so'rov formatidan foydalanadi va faqat options.metod qiymatini o'zgartiring.

Axios yordamida Node.js-da HTTP so'rovlari

Axios bu juda mashhur JavaScript kutubxonasidir, siz HTTP so'rovlarini bajarishda foydalanishingiz mumkin, bu ikkala brauzer va Node.js platformalarida ishlaydi.

U barcha zamonaviy brauzerlarni, jumladan IE8 va undan yuqori versiyalarni qo'llab-quvvatlaydi.

Bu va'daga asoslangan va bu bizga XHR so'rovlarini juda oson bajarish uchun async / kutish kodini yozishimizga imkon beradi.

Axios-dan foydalanish mahalliy Fetch API-ga nisbatan bir qator afzalliklarga ega:

  • eski brauzerlarni qo'llab-quvvatlaydi (Fetch-ga to'ldirish kerak)
  • so'rovni bekor qilish usuli mavjud
  • javob vaqtini belgilash usuli mavjud
  • o'rnatilgan CSRF himoyasiga ega
  • yuklash jarayonini qo'llab-quvvatlaydi
  • avtomatik JSON ma'lumotlarini o'zgartirishni amalga oshiradi
  • Node.js-da ishlaydi

O'rnatish

Aksios npm yordamida o'rnatilishi mumkin:

npm aksiyalarni o'rnatish

yoki kalava:

ip qo'shing aksios

yoki shunchaki unpkg.com orqali o'z sahifangizga kiriting:

Axios API

Siz HTTP so'rovini axios ob'ektidan boshlashingiz mumkin:

axios ({
  url: 'https://dog.ceo/api/breeds/list/all',
  usul: "olish",
  ma'lumotlar: {
    foo: "bar"
  }
})

ammo qulaylik uchun siz odatda foydalanasiz:

  • axios.get ()
  • axios.post ()

(jQuery-da bo'lgani kabi, $ .ajax () o'rniga $ .get () va $ .post () ni ishlatasiz.

Axios kam mashhur bo'lgan, ammo hanuzgacha ishlatiladigan barcha HTTP fe'llari uchun usullarni taklif etadi:

  • axios.delete ()
  • axios.put ()
  • axios.patch ()
  • axios.options ()

tanani olib tashlab, so'rovning HTTP sarlavhalarini olish usuli:

  • axios.head ()

GET so'rovlari

Axios-dan foydalanishning qulay usullaridan biri zamonaviy (ES2017) asinx / kutish sintaksisidan foydalanishdir.

Ushbu Node.js misoli axios.get () -dan foydalanib, barcha it zotlarining ro'yxatini olish uchun Dog API-ga murojaat qiladi va ularni hisobga oladi:

const aksios = zarur ('aksios')
const getBreeds = async () => {
  urinib ko'ring {
    qaytishni kuting axios.get ('https://dog.ceo/api/breeds/list/all')
  } qo'lga olish (xato) {
    konsol.error (xato)
  }
}
const countBreeds = async () => {
  const zotlari = kuting getBreeds ()
  if (breeds.data.message) {
    console.log (`Got $ {Object.entries (breeds.data.message) .length} zotlari ')
  }
}
countBreeds ()

Agar siz async / kutishni xohlamasangiz, "Va'dalar" sintaksisidan foydalanishingiz mumkin:

const aksios = zarur ('aksios')
const getBreeds = () => {
  urinib ko'ring {
    qaytish axios.get ('https://dog.ceo/api/breeds/list/all')
  } qo'lga olish (xato) {
    konsol.error (xato)
  }
}
const countBreeds = async () => {
  const zotlari = getBreeds ()
    .then (javob => {
      if (javob.data.message) {
        konsol.log (
          `$ $ Object.entries (javob.data.message) .length} zotlarini oldingiz '
        )
      }
    })
    .catch (xato => {
      console.log (xato)
    })
}
countBreeds ()

GET so'rovlariga parametrlarni qo'shish

GET javob URL manzilidagi parametrlarni o'z ichiga olishi mumkin, masalan: https://site.com/?foo=bar

Axios yordamida siz buni quyidagi URL-dan foydalanib bajarishingiz mumkin:

axios.get ('https://site.com/?foo=bar')

yoki parametrlarda params xususiyatidan foydalanishingiz mumkin:

axios.get ('https://site.com/', {
  parchalar: {
    foo: "bar"
  }
})

POST so'rovlari

POST so'rovini bajarish xuddi GET so'rovini bajarishga o'xshaydi, lekin axios.get o'rniga axios.post-dan foydalanasiz:

axios.post ('https://site.com/')

POST parametrlarini o'z ichiga olgan ob'ekt ikkinchi dalil:

axios.post ('https://site.com/', {
  foo: "bar"
})

Node.js-da WebSockets-dan foydalanish

WebSockets veb-ilovalarda HTTP aloqasiga alternativa.

Ular mijoz va server o'rtasida uzoq muddatli, ikki tomonlama aloqa kanalini taklif qiladi.

O'rnatilgandan so'ng, kanal ochiq holatda bo'ladi, bu past kutish va qo'shimcha xarajatlar bilan juda tez ulanishni taklif qiladi.

WebSockets-ni brauzer orqali qo'llab-quvvatlash

WebSockets barcha zamonaviy brauzerlar tomonidan qo'llab-quvvatlanadi.

WebSockets HTTP-dan qanday farq qiladi

HTTP juda boshqacha protokoli va boshqa aloqa usuliga ega.

HTTP - so'rov / javob protokoli: server ba'zi ma'lumotlarni talab qilganda ma'lumotlarni qaytaradi.

WebSockets bilan:

  • server aniq bir narsani talab qilmasdan mijozga xabar yuborishi mumkin
  • mijoz va server bir vaqtning o'zida bir-biri bilan gaplashishi mumkin
  • xabarlarni yuborish uchun juda oz miqdordagi ma'lumot almashish kerak. Bu past kechikish aloqasini anglatadi.

WebSockets real vaqt va uzoq muddatli aloqa uchun juda yaxshi.

HTTP vaqti-vaqti bilan ma'lumotlar almashish va mijoz tashabbusi bilan ishlash uchun juda yaxshi.

HTTPni amalga oshirish ancha sodda, WebSockets esa qo'shimcha xarajatlarni talab qiladi.

Xavfsiz WebSockets

Har doim WebSockets uchun xavfsiz, shifrlangan protokoldan foydalaning, wss: //.

ws: // WebSocketsning xavfli versiyasiga tegishli (WebSocketsning http: //) va aniq sabablarga ko'ra ularni chetlab o'tish kerak.

Yangi WebSockets aloqasini yarating

const url = 'wss: //myserver.com/something'
ulanish = yangi WebSocket (URL)

ulanish - bu WebSocket ob'ekti.

Ulanish muvaffaqiyatli o'rnatilganda, ochiq eshik o'chiriladi.

Ulanish ob'ektining ochiq-oydin ishlashiga qayta qo'ng'iroq qilish funktsiyasini tayinlab, uni tinglang:

connection.onopen = () => {
  // ...
}

Agar biron-bir xato bo'lsa, yana funktsiyani qaytarib yuborish funktsiyasi o'chiriladi:

connection.onerror = error => {
  console.log (`WebSocket xatosi: $ {error}`)
}

WebSockets-dan foydalanib serverga ma'lumotlarni yuborish

Ulanish ochilgach, siz ma'lumotlarni serverga yuborishingiz mumkin.

Buni ochilgan qo'ng'iroqni qaytarish funktsiyasida qulay tarzda qilishingiz mumkin:

connection.onopen = () => {
  ulanish.send ("hey")
}

WebSockets yordamida serverdan ma'lumotlarni qabul qilish

Xabarlar voqeasi qabul qilinganida chaqiriladigan onmessage-da qo'ng'iroqni qaytarish funktsiyasi bilan tinglang:

Ulanish.onmessage = e => {
  konsol.log (m-n, ma'lumotlar)
}

Node.js-da WebSockets serverini amalga oshiring

ws bu Node.js uchun mashhur WebSockets kutubxonasidir.

Biz undan WebSockets serverini yaratish uchun foydalanamiz. Bundan tashqari, mijozni amalga oshirish uchun foydalanish mumkin va WebSockets-dan foydalanib, ikkita oxirgi xizmat o'rtasida aloqa o'rnatish mumkin.

Uni osongina o'rnatib qo'ying:

ip boshlanishi
ip qo'shing ws

Siz yozishingiz kerak bo'lgan kod juda oz:

WebSocket = talab ('ws')
const wss = yangi WebSocket.Server ({port: 8080})
wss.on ('ulanish', ws => {
  ws.on ('xabar', xabar => {
    console.log (`Qabul qilingan xabar => $ {xabar}`)
  })
  ws.send ('ho!')
})

Ushbu kod 8080 portida (WebSockets uchun standart port) yangi server yaratadi va ulanish o'rnatilganda qayta qo'ng'iroq qilish funktsiyasini qo'shadi, ho! mijozga va qabul qilingan xabarlarni qayd qilish.

Glitch-da jonli misolni ko'ring

Mana WebSockets serverining jonli namunasi.

Bu erda server bilan o'zaro aloqada bo'lgan WebSockets mijozi mavjud.

Node.js-da fayl tavsiflovchilari bilan ishlash

Fayl tizimingizda joylashgan fayl bilan o'zaro ishlashdan oldin, siz fayl tavsifini olishingiz kerak.

FS moduli tomonidan taqdim etilgan open () usulidan foydalanib faylni ochish bilan qaytariladigan fayl tavsifi.

const fs = zarur ('fs')
fs.open ('/ Users / flavio / test.txt', 'r', (err, fd) => {
  // fd bu bizning fayl tavsiflovchimiz
})

Biz fs.open () chaqiruvida ikkinchi parametr sifatida foydalangan rga e'tibor bering.

Ushbu bayroq biz faylni o'qish uchun ochganimizni anglatadi.

Siz ishlatadigan boshqa bayroqlar

  • r + faylni o'qish va yozish uchun oching
  • w + faylni o'qish va yozish uchun oching, faylni fayl boshida joylashtiring. Fayl mavjud bo'lmasa yaratiladi
  • yozuv uchun faylni oching, faylni oxiriga joylashtiring. Fayl mavjud bo'lmasa yaratiladi
  • a + o'qish va yozish uchun faylni oching, faylni oxiriga joylashtiring. Fayl mavjud bo'lmasa yaratiladi

Bundan tashqari, fs.openSync usulidan foydalanib, faylni ochishingiz mumkin, bu fayl tavsifi ob'ekti qayta qo'ng'iroq qilish o'rniga uni qaytaradi:

const fs = zarur ('fs')
urinib ko'ring {
  const fd = fs.openSync ('/ Foydalanuvchilar / flavio / test.txt', 'r')
} qo'lga olish (err) {
  konsol.error (xato)
}

Fayl tavsifini olganingizdan so'ng, siz istagan usul bilan uni talab qiladigan barcha operatsiyalarni bajarishingiz mumkin, masalan fs.open () ni chaqirish va fayl tizimi bilan o'zaro aloqada bo'lgan boshqa operatsiyalar.

Node.js fayl statistikasi

Har bir fayl Node.js.-dan foydalanib tekshirishimiz mumkin bo'lgan tafsilotlar to'plamini o'z ichiga oladi.

Xususan, fs moduli tomonidan taqdim etilgan stat () usuli yordamida.

Siz uni fayl yo'lidan o'tayotgan deb ataysiz va Node.js fayl ma'lumotlarini olgandan so'ng, siz 2 parametr bilan o'tadigan qayta qo'ng'iroq qilish funktsiyasini chaqiradi: xato xabari va faylning holati:

const fs = zarur ('fs')
fs.stat ('/ Users / flavio / test.txt', (err, statistika) => {
  agar (xato) {
    konsol.error (xato)
    qaytish
  }
  // bizda "stats" da fayllar statistikasiga kirish imkoni mavjud
})

Node.js sinxronizatsiya usulini ham ta'minlaydi, bu fayl holati tayyor bo'lguncha ipni to'sib qo'yadi:

const fs = zarur ('fs')
urinib ko'ring {
  const stats = fs.stat ('/ Foydalanuvchilar / flavio / test.txt')
} qo'lga olish (err) {
  konsol.error (xato)
}

Fayl ma'lumotlari stats o'zgaruvchisiga kiritilgan. Statistikadan qanday ma'lumotni olishimiz mumkin?

Ko'p narsa, shu jumladan:

  • agar fayl katalog yoki fayl bo'lsa, stats.isFile () va stats.isDirectory () dan foydalaning.
  • agar fayl stats.isSymbolicLink () yordamida ramziy aloqa bo'lsa
  • stats.size yordamida fayl hajmi.

Boshqa ilg'or usullar mavjud, ammo kundalik dasturlashda ishlatadigan narsalarning asosiy qismi quyidagilardan iborat:

const fs = zarur ('fs')
fs.stat ('/ Users / flavio / test.txt', (err, statistika) => {
  agar (xato) {
    konsol.error (xato)
    qaytish
  }
  stats.isFile () // rost
  stats.isDirectory () // noto'g'ri
  stats.isSymbolicLink () // noto'g'ri
  stats.size // 1024000 // = 1MB
})

Node.js fayl yo'llari

Tizimdagi har bir faylda yo'l bor.

Linux va MacOS-da yo'l quyidagicha ko'rinishi mumkin:

/users/flavio/file.txt

Windows kompyuterlari bir-biridan farq qiladi va quyidagi tuzilishga ega:

C: \ users \ flavio \ file.txt

Ilovalaringizda yo'llardan foydalanganda e'tibor berish kerak, chunki bu farqni hisobga olish kerak.

Ushbu modulni quyidagilar yordamida fayllaringizga kiritasiz:

const path = zarur ('yo'l')

va siz uning usullaridan foydalanishni boshlashingiz mumkin.

Ma'lumotni yo'ldan tashqariga chiqarish

Agar yo'l berilgan bo'lsa, unda siz ushbu usullar yordamida ma'lumotni chiqarib olishingiz mumkin:

  • dirname: faylning ota-papkasini oling
  • basename: fayl nomini olish
  • extname: fayl kengaytmasini oling

Masalan:

const notes = '/users/flavio/notes.txt'
path.dirname (eslatmalar) // / foydalanuvchilar / flavio
path.basename (eslatmalar) // notes.txt
path.extname (eslatmalar) // .txt

Siz fayl nomini kengaytmalarsiz bazename uchun ikkinchi dalilni ko'rsatib olishingiz mumkin:

path.basename (eslatmalar, path.extname (eslatmalar)) // eslatmalar

Yo'llar bilan ishlash

Siz path.join () yordamida yo'lning ikki yoki undan ko'p qismiga qo'shilishingiz mumkin:

const name = 'flavio'
path.join ('/', 'foydalanuvchilar', nomi, 'notes.txt') //'/users/flavio/notes.txt '

Siz nisbiy yo'lning aniq yo'lini hisoblash uchun path.resolve () yordamida olishingiz mumkin:

path.resolve ('flavio.txt')
//'Users/flavio/flavio.txt 'agar mening uyim papkasida ishlayotgan bo'lsa

Bu holda Node.js amaldagi katalogga /flavio.txt ni oddiygina qo'shadi. Agar siz ikkinchi parametrlar papkasini belgilasangiz, ikkinchisiga asos sifatida birinchidan foydalaning:

path.resolve ('tmp', 'flavio.txt')
// '/Users/flavio/tmp/flavio.txt' agar mening uy papkamdan ishlayotgan bo'lsa

Agar birinchi parametr chiziq bilan boshlangan bo'lsa, demak bu mutlaq yo'l:

path.resolve ('/ etc', 'flavio.txt')
// '/etc/flavio.txt'

path.normalize () - bu boshqa o'ziga xos funktsiyalar bo'lib, ularda shunga o'xshash o'ziga xos xususiyatlar mavjud bo'lganda haqiqiy yo'lni sinab ko'rish va hisoblash imkoniyati mavjud. yoki .., yoki ikki marta egri chiziqlar:

path.normalize ('/ users / flavio /..// test.txt')
// /users/test.txt

Ammo hal qiling va normallashtiring, bu yo'l mavjud yoki yo'qligini tekshirmaydi. Ular shunchaki olingan ma'lumotlarga asoslanib yo'lni hisoblaydilar.

Node.js bilan fayllarni o'qish

Node.js-da faylni o'qishning eng oddiy usuli - bu fayl ma'lumotlari (va xato) bilan chaqiriladigan fs.readFile () usulidan foydalanish, unga fayl yo'li va qo'ng'iroqni qaytarish funktsiyasi:

const fs = zarur ('fs')
fs.readFile ('/ Users / flavio / test.txt', (xato, ma'lumotlar) => {
  agar (xato) {
    konsol.error (xato)
    qaytish
  }
  konsol.log (ma'lumotlar)
})

Shu bilan bir qatorda, siz fs.readFileSync () sinxron versiyasidan foydalanishingiz mumkin:

const fs = zarur ('fs')
urinib ko'ring {
  const data = fs.readFileSync ('/ Foydalanuvchilar / flavio / test.txt')
  konsol.log (ma'lumotlar)
} qo'lga olish (err) {
  konsol.error (xato)
}

Standart kodlash bu utf8, ammo siz ikkinchi parametr yordamida maxsus kodlashni ko'rsatishingiz mumkin.

Fs.readFile () va fs.readFileSync () ma'lumotlarni qaytarishdan oldin xotiradagi faylning to'liq tarkibini o'qiydi.

Bu shuni anglatadiki, katta fayllar sizning xotira sarfi va dasturni bajarish tezligiga katta ta'sir qiladi.

Bunday holda, fayl tarkibini oqimlardan foydalanib o'qish yaxshi variant.

Node.js bilan fayllarni yozish

Node.js-da fayllarga yozishning eng oson usuli bu fs.writeFile () API-dan foydalanish.

Masalan:

const fs = zarur ('fs')
const content = 'Ba'zi tarkib!'
fs.writeFile ('/ Users / flavio / test.txt', tarkib, (err) => {
  agar (xato) {
    konsol.error (xato)
    qaytish
  }
  // fayl muvaffaqiyatli yozildi
})

Shu bilan bir qatorda, siz fs.writeFileSync () sinxron versiyasidan foydalanishingiz mumkin:

const fs = zarur ('fs')
const content = 'Ba'zi tarkib!'
urinib ko'ring {
  const data = fs.writeFileSync ('/ Foydalanuvchilar / flavio / test.txt', tarkib)
  // fayl muvaffaqiyatli yozildi
} qo'lga olish (err) {
  konsol.error (xato)
}

Odatiy bo'lib, ushbu API allaqachon mavjud bo'lsa, tarkibni almashtiradi.

Siz bayroqni belgilab, standartni o'zgartirishingiz mumkin:

fs.writeFile ('/ Users / flavio / test.txt', tarkib, {bayroq: 'a +'}, (err) => {})

Siz foydalanishingiz mumkin bo'lgan bayroqlar:

  • r + faylni o'qish va yozish uchun oching
  • w + faylni o'qish va yozish uchun oching, faylni fayl boshida joylashtiring. Fayl mavjud bo'lmasa yaratiladi
  • yozuv uchun faylni oching, faylni oxiriga joylashtiring. Fayl mavjud bo'lmasa yaratiladi
  • a + o'qish va yozish uchun faylni oching, faylni oxiriga joylashtiring. Fayl mavjud bo'lmasa yaratiladi

Bayroqlar haqida ko'proq ma'lumot olishingiz mumkin.

Faylga qo'shing

Fayl oxiriga tarkibni qo'shish uchun qulay usul fs.appendFile () (va uning fs.appendFileSync () hamkasbi):

const content = 'Ba'zi tarkib!'
fs.appendFile ('file.log', tarkib, (err) => {
  agar (xato) {
    konsol.error (xato)
    qaytish
  }
  // bajarildi!
})

Oqimlardan foydalanilmoqda

Ushbu usullarning barchasi faylni to'liq tarkibini faylga yozadi, boshqaruvni dasturga qaytarishdan oldin (async versiyasida, bu qayta qo'ng'iroqni amalga oshirishni anglatadi)

Bunday holda, fayl tarkibini oqimlardan foydalanib yozish yaxshiroq variant.

Node.js-da papkalar bilan ishlash

Node.js fs yadro moduli papkalar bilan ishlashda foydalanishingiz mumkin bo'lgan juda ko'p qulay usullarni taqdim etadi.

Jild mavjudligini tekshiring

Jild mavjudligini yoki Node.js-ning ruxsati bilan unga kirishini tekshirish uchun fs.access () -ni ishlating.

Yangi papka yarating

Yangi papka yaratish uchun fs.mkdir () yoki fs.mkdirSync () dan foydalaning:

const fs = zarur ('fs')
const folderName = '/ Foydalanuvchilar / flavio / test'
urinib ko'ring {
  if (! fs.existsSync (dir)) {
    fs.mkdirSync (dir)
  }
} qo'lga olish (err) {
  konsol.error (xato)
}

Katalog tarkibini o'qing

Katalog tarkibini o'qish uchun fs.readdir () yoki fs.readdirSync-dan foydalaning.

Kodning ushbu bo'lagi papka tarkibini, ham fayllarni, ham jildlarni o'qiydi va ularning nisbiy yo'lini qaytaradi:

const fs = zarur ('fs')
const path = zarur ('yo'l')
const folderPath = '/ Foydalanuvchilar / flavio'
fs.readdirSync (folderPath)

Siz to'liq yo'lni olishingiz mumkin:

fs.readdirSync (folderPath) .map (fileName => {
  return path.join (folderPath, fileName)
}

Siz natijalarni faqat fayllarni qaytarish uchun filtrlashingiz va papkalarni chiqarib tashlashingiz mumkin:

const isFile = fileName => {
  return fs.lstatSync (fileName) .isFile ()
}
fs.readdirSync (folderPath) .map (fileName => {
  return path.join (folderPath, fileName)) filtr (isFile)
}

Jildning nomini o'zgartirish

Jildning nomini o'zgartirish uchun fs.rename () yoki fs.renameSync () dan foydalaning.

Birinchi parametr - joriy yo'l, ikkinchisi - yangi yo'l:

const fs = zarur ('fs')
fs.rename ('/ Users / flavio', '/ Users / roger', (err) => {
  agar (xato) {
    konsol.error (xato)
    qaytish
  }
  // bajarildi
})

fs.renameSync () - sinxron versiya:

const fs = zarur ('fs')
urinib ko'ring {
  fs.renameSync ('/ Foydalanuvchilar / flavio', '/ Foydalanuvchilar / roger')
} qo'lga olish (err) {
  konsol.error (xato)
}

Jildni olib tashlang

Jildni o'chirish uchun fs.rmdir () yoki fs.rmdirSync () dan foydalaning.

Tarkibi bo'lgan papkani olib tashlash sizdan ko'ra murakkabroq bo'lishi mumkin.

Bu holda men fs-extra modulini o'rnatishni tavsiya etaman, u juda mashhur va yaxshi saqlanadi va fs-modulni qo'shimcha funktsiyalar bilan ta'minlab, uni almashtirish.

Bu holda olib tashlash () usuli siz xohlagan narsadir.

Uni quyidagilar yordamida o'rnating:

npm fs-extra o'rnatish

va quyidagicha foydalaning:

const fs = zarur ('fs-extra')
const folder = '/ Foydalanuvchilar / flavio'
fs.remove (papka, err => {
  konsol.error (xato)
})

Bundan va'dalar bilan ham foydalanish mumkin:

fs.remove (papka) .dan keyin (() => {
  // bajarildi
(err => {
  konsol.error (xato)
})

yoki async / kutish bilan:

asinx funktsiyasi removeFolder (papka) {
  urinib ko'ring {
    fs.remove (papka) ni kuting
    // bajarildi
  } qo'lga olish (err) {
    konsol.error (xato)
  }
}
const folder = '/ Foydalanuvchilar / flavio'
removeFolder (papka)

Node.js fs moduli

Fs moduli fayl tizimiga kirish va o'zaro ta'sir o'tkazish uchun juda ko'p foydali funktsiyalarni ta'minlaydi.

O'rnatishning hojati yo'q. Node.js yadrosining bir qismi bo'lish uchun uni oddiygina talab qilish orqali foydalanish mumkin:

const fs = zarur ('fs')

Shunday qilgandan so'ng, siz uning barcha usullariga kirish huquqiga egasiz, ular quyidagilardan iborat.

  • fs.access (): fayl mavjudligini va Node o'z ruxsati bilan unga kira olishini tekshiring
  • fs.appendFile (): ma'lumotlarni faylga qo'shish. Agar fayl mavjud bo'lmasa, u yaratilgan
  • fs.chmod (): o'tgan fayl nomi bilan ko'rsatilgan faylning ruxsatlarini o'zgartirish. Tegishli: fs.lchmod (), fs.fchmod ()
  • fs.chown (): o'tgan fayl nomi bilan ko'rsatilgan fayl egasi va guruhini o'zgartirish. Tegishli: fs.fchown (), fs.lchown ()
  • fs.close (): fayl tavsifini yoping
  • fs.copyFile (): fayl nusxasini oladi
  • fs.createReadStream (): o'qiladigan fayl oqimini yaratish
  • fs.createWriteStream (): yoziladigan fayl oqimini yarating
  • fs.link (): faylga yangi qattiq havola yarating
  • fs.mkdir (): yangi papka yarating
  • fs.mkdtemp (): vaqtinchalik katalog yaratish
  • fs.open (): fayl rejimini sozlash
  • fs.readdir (): katalog tarkibini o'qish
  • fs.readFile (): fayl tarkibini o'qish. Tegishli: fs.read ()
  • fs.readlink (): ramziy bog'lanish qiymatini o'qing
  • fs.realpath (): (., ..) nisbiy fayllar yo'llarini to'liq yo'l bilan hal qiling
  • fs.rename (): fayl yoki papkaning nomini o'zgartirish
  • fs.rmdir (): papkani olib tashlash
  • fs.stat (): o'tgan fayl nomi bilan aniqlangan fayl holatini qaytaradi. Tegishli: fs.fstat (), fs.lstat ()
  • fs.symlink (): faylga yangi ramziy aloqa yaratish
  • fs.truncate (): berilgan fayl nomi bilan aniqlangan faylni belgilangan uzunlikka qisqartiring. Tegishli: fs.ftruncate ()
  • fs.unlink (): faylni yoki ramziy havolani olib tashlang
  • fs.unwatchFile (): fayldagi o'zgarishlarni ko'rishni to'xtatish
  • fs.utimes (): o'tgan fayl nomi bilan aniqlangan vaqt vaqtini o'zgartirish. Tegishli: f.futimes ()
  • fs.watchFile (): fayldagi o'zgarishlarni ko'rishni boshlang. Aloqador: fs.watch ()
  • fs.writeFile (): ma'lumotlarni faylga yozish. Aloqador: fs.write ()

FS modulining yana bir o'ziga xos xususiyati shundaki, barcha usullar asenkron bo'lib ishlaydi, ammo ular Sync-ga qo'shilib ham sinxron ishlashi mumkin.

Masalan:

  • fenomen ()
  • fs.renameSync ()
  • fs.write ()
  • fs.writeSync ()

Bu sizning dastur oqimida katta farq qiladi.

10-tugun va'daga asoslangan API uchun eksperimental yordamni o'z ichiga oladi.

Masalan, fs.rename () usulini ko'rib chiqaylik. Asenkron API qayta qo'ng'iroq qilishda ishlatiladi:

const fs = zarur ('fs')
fs.rename ('before.json', 'after.json', (err) => {
  agar (xato) {
    return console.error (err)
  }
  // bajarildi
})

Sinxron API-ni shunday ishlatish mumkin, bunda xatolarni bartaraf etish uchun urinish / olish bloki mavjud:

const fs = zarur ('fs')
urinib ko'ring {
  fs.renameSync ('before.json', 'after.json')
  // bajarildi
} qo'lga olish (err) {
  konsol.error (xato)
}

Bu erda asosiy farq shundaki, ikkinchi misolda skriptingizning bajarilishi fayl jarayoni muvaffaqiyatli bajarilgunga qadar bloklanadi.

Node.js yo'l moduli

Yo'l moduli fayl tizimiga kirish va o'zaro ta'sir o'tkazish uchun juda ko'p foydali funktsiyalarni ta'minlaydi.

O'rnatishning hojati yo'q. Node.js yadrosining bir qismi bo'lish uchun uni oddiygina talab qilish orqali foydalanish mumkin:

const path = zarur ('yo'l')

Ushbu modul yo'l segmentlarini ajratuvchini (\ Windows va / Linux / macOS-da) va yo'l ajratuvchini (; Windowsda va: Linux / macOS-da) ta'minlovchi path.delimiter-ni taqdim etadi.

Bu yo'l usullari.

path.basename ()

Yo'lning oxirgi qismini qaytaring. Ikkinchi parametr fayl kengaytmasini filtrlashi mumkin:

talab qilish ('yo'l'). basename ('/ test / bir narsa') // nimadir
talab qilish ('yo'l'). bazename ('/ test / something.txt') //something.txt
talab qilish ('yo'l'). basename ('/ test / something.txt', '.txt') // nimadir

path.dirname ()

Yo'lning katalog qismini qaytaring:

dirname ('/ test / biror narsa') // / test
dirname ('/ test / bir narsa / file.txt') // / test / biror narsa

path.extname ()

Yo'lning kengaytma qismini qaytaring:

talab ('yo'l'). dirname ('/ test / biror narsa') // ''
talab ('yo'l'). dirname ('/ test / narsa / file.txt') // '.txt'

path.isAbsolute ()

Agar haqiqiy yo'l bo'lsa, haqiqiy qiymatni qaytaradi:

talab qilish ('yo'l'). isAbsolute ('/ test / biror narsa') // rost
talab qilish ('yo'l'). isAbsolute ('./ test / narsa') // noto'g'ri

path.join ()

Yo'lning ikki yoki undan ko'p qismiga qo'shilish:

const name = 'flavio'
talab qilish ('yo'l'). qo'shilish ('/', 'foydalanuvchilar', nomi, 'notes.txt') //'/users/flavio/notes.txt '

path.normalize ()

Nisbatan aniqlashtiruvchilar mavjud bo'lganda haqiqiy yo'lni hisoblashga harakat qiladi. yoki .., yoki ikki marta egri chiziqlar:

normalizatsiya qilish ('/ users / flavio /..// test.txt') ///users/test.txt

path.parse ()

Ob'ektga yo'lni uni tashkil etuvchi segmentlari bilan tahlil qiladi:

  • ildiz: ildiz
  • dir: papkaning yo'nalishi ildizdan boshlanadi
  • bazasi: fayl nomi + kengaytmasi
  • name: fayl nomi
  • ext: fayl kengaytmasi

Masalan:

Talab qilish ('path'). tahlil qilish ('/ users / test.txt')

natijalar:

{
  ildiz: '/',
  dir: '/ users',
  baza: 'test.txt',
  ext: '.txt',
  nomi: 'sinov'
}

path.relative ()

Dalil sifatida 2 yo'lni qabul qiladi. Joriy ishchi katalog asosida birinchi yo'ldan ikkinchisiga nisbiy yo'lni qaytaradi.

Masalan:

talab ('yo'l'). nisbiy ('/ Users / flavio', '/Users/flavio/test.txt') //'test.txt '
talab qilish ('yo'l'). nisbiy ('/ Users / flavio', '/Users/flavio/something/test.txt') //'something/test.txt '

path.resolve ()

Siz nisbiy yo'lning aniq yo'lini hisoblash uchun path.resolve () yordamida olishingiz mumkin:

path.resolve ('flavio.txt')
//'Users/flavio/flavio.txt 'agar mening uyim papkasida ishlayotgan bo'lsa

Ikkinchi parametrni belgilab, ikkinchisi uchun asos sifatida birinchidan foydalaning:

path.resolve ('tmp', 'flavio.txt')
//'Users/flavio/tmp/flavio.txt 'agar mening uy papkamdan ishlayotgan bo'lsa

Agar birinchi parametr chiziq bilan boshlangan bo'lsa, demak bu mutlaq yo'l:

path.resolve ('/ etc', 'flavio.txt')
//'/etc/flavio.txt '

Node.js os moduli

Ushbu modul asosiy operatsion tizim va dastur ishlayotgan kompyuterdan ma'lumotlarni olish va ular bilan o'zaro ishlashda foydalanishingiz mumkin bo'lgan ko'plab funktsiyalarni taqdim etadi.

const os = talab qilish ('os')

Fayllarni qayta ishlash bilan bog'liq ba'zi muhim narsalarni aytib beradigan bir nechta foydali xususiyatlar mavjud:

os.EOL chiziqni ajratuvchi ketma-ketlikni beradi. Bu Linux va MacOS-da, va \ r \ n Windows-da.

Linux va macOS deganda men POSIX platformalarini nazarda tutaman. Oddiylik uchun men Node ishlaydigan boshqa kam mashhur operatsion tizimlarni istisno qilaman.

os.constants.signals bizga SIGHUP, SIGKILL va hokazo kabi signal signallarini qayta ishlash bilan bog'liq barcha konstantalarni aytadi.

os.constants.errno EADDRINUSE, EOVERFLOW va boshqalar kabi xatolar haqida xabar berish uchun doimiylarni o'rnatadi.

Barchasini bu erda o'qishingiz mumkin.

Endi osning asosiy usullarini ko'rib chiqaylik:

  • os.arch ()
  • os.cpus ()
  • os.endianness ()
  • os.freemem ()
  • os.homedir ()
  • os.hostname ()
  • os.loadavg ()
  • os.networkInterfaces ()
  • os.platform ()
  • os.release ()
  • os.tmpdir ()
  • os.totalmem ()
  • os.type ()
  • os.uptime ()
  • os.userInfo ()

os.arch ()

Arm, x64, arm64 kabi asosiy arxitekturani aniqlaydigan satrni qaytaring.

os.cpus ()

Tizimda mavjud bo'lgan CPU haqida ma'lumotni qaytaring.

Masalan:

[{model: 'Intel (R) Core (TM) 2 Duo CPU P8600 @ 2.40GHz',
    tezlik: 2400,
    marta:
     {foydalanuvchi: 281685380,
       yaxshi: 0,
       sys: 187986530,
       bekor: 685833750,
       irq: 0}},
  {model: 'Intel (R) Core (TM) 2 Duo CPU P8600 @ 2.40GHz',
    tezlik: 2400,
    marta:
     {foydalanuvchi: 282348700,
       yaxshi: 0,
       sys: 161800480,
       bekor: 703509470,
       irq: 0}}]

os.endianness ()

Node.js Big Endian yoki Little Endian bilan tuzilganligiga qarab BE yoki LE ni qaytaring.

os.freemem ()

Tizimda bo'sh xotirani ifodalovchi baytlar sonini qaytaring.

os.homedir ()

Joriy foydalanuvchining uy katalogiga yo'lni qaytaring.

Masalan:

'/ Foydalanuvchilar / flavio'

os.hostname ()

Xost nomini qaytaring.

os.loadavg ()

Operatsion tizim tomonidan qilingan hisob-kitobni yukning o'rtacha qiymatiga qaytaring.

Bu faqat Linux va MacOS-da muhim ma'noni beradi.

Masalan:

[3.68798828125, 4.00244140625, 11.1181640625]

os.networkInterfaces ()

Tizimingizda mavjud bo'lgan tarmoq interfeysi tafsilotlarini qaytaradi.

Masalan:

{lo0:
   [{manzil: '127.0.0.1',
       netmask: '255.0.0.0',
       oila: 'IPv4',
       mac: 'fe: 82: 00: 00: 00: 00',
       ichki: true},
     { 1 Manzil',
       netmask: 'ffff: ffff: ffff: ffff: ffff: ffff: ffff: ffff',
       oila: 'IPv6',
       mac: 'fe: 82: 00: 00: 00: 00',
       qamrov: 0,
       ichki: true},
     {manzil: 'fe80 :: 1',
       netmask: 'ffff: ffff: ffff: ffff ::',
       oila: 'IPv6',
       mac: 'fe: 82: 00: 00: 00: 00',
       qamrov: 1,
       ichki: true}],
  en1:
   [{manzil: 'fe82 :: 9b: 8282: d7e6: 496e',
       netmask: 'ffff: ffff: ffff: ffff ::',
       oila: 'IPv6',
       mac: '06: 00: 00: 02: 0e: 00 ',
       qamrov: 5,
       ichki: noto'g'ri},
     {manzil: '192.168.1.38',
       netmask: '255.255.255.0',
       oila: 'IPv4',
       mac: '06: 00: 00: 02: 0e: 00 ',
       ichki: yolg'on}],
  utun0:
   [{manzil: 'fe80 :: 2513: 72bc: f405: 61d0',
       netmask: 'ffff: ffff: ffff: ffff ::',
       oila: 'IPv6',
       mac: 'fe: 80: 00: 20: 00: 00',
       qamrov: 8,
       ichki: soxta}]}

os.platform ()

Node.js uchun tuzilgan platformani qaytaring:

  • darvin
  • freebsd
  • linux
  • ochiqboshlar
  • win32
  • …Ko'proq

os.release ()

Operatsion tizimni bo'shatish raqamini aniqlaydigan satrni qaytaradi.

os.tmpdir ()

Belgilangan temp papkasiga yo'lni qaytaradi.

os.totalmem ()

Tizimda mavjud bo'lgan umumiy xotirani ifodalovchi baytlar sonini qaytaradi.

os.type ()

Operatsion tizimni aniqlaydi:

  • Linux
  • Darvin MacOS-da
  • Windows-da Windows_NT

os.uptime ()

Kompyuter oxirgi marta qayta yoqilganidan beri ishlagan soniyalar sonini qaytaradi.

Node.js hodisalar moduli

Voqealar moduli bizga Node.js-da voqealar bilan ishlash uchun kalit bo'lgan EventEmitter sinfini taqdim etadi.

Men bu haqida to'liq maqola e'lon qildim, shuning uchun bu erda men API-ni undan qanday foydalanish bo'yicha boshqa misollarsiz tasvirlab beraman.

const EventEmitter = zarur ('voqealar')
const eshik = yangi EventEmitter ()

Tadbir tinglovchisi o'z itining ovqatini eydi va quyidagi tadbirlardan foydalanadi

  • tinglovchi qo'shilganda newListener
  • tinglovchi o'chirilganda removeListener

Bu erda eng foydali usullarning batafsil tavsifi:

  • emitter.addListener ()
  • emitter.emit ()
  • emitter.eventNames ()
  • emitter.getMaxListeners ()
  • emitter.listenerCount ()
  • emitter.listeners ()
  • emitter.off ()
  • emitter.on ()
  • emitter.once ()
  • emitter.prependListener ()
  • emitter.prependOnceListener ()
  • emitter.removeAllListeners ()
  • emitter.removeListener ()
  • emitter.setMaxListeners ()

emitter.addListener ()

Emitter.on () uchun taxallus.

emitter.emit ()

Hodisani chiqaradi. U har bir voqea tinglovchilarini ro'yxatdan o'tgan tartibiga ko'ra sinxron ravishda chaqiradi.

emitter.eventNames ()

Joriy EventListener-da ro'yxatga olingan voqealarni ko'rsatuvchi qatorlar qatorini qaytaring:

eshik.eventNames ()

emitter.getMaxListeners ()

EventListener ob'ektiga qo'shishi mumkin bo'lgan maksimal tinglovchilar sonini oling, bu esa 10 ga o'rnatilgan, ammo setMaxListeners () yordamida ko'paytirilishi yoki kamaytirilishi mumkin:

door.getMaxListeners ()

emitter.listenerCount ()

Parametr sifatida o'tgan tadbir tinglovchilarining sonini oling:

eshik.listenerCount ('ochiq')

emitter.listeners ()

Parametr sifatida o'tgan tadbir tinglovchilarining qatorini oladi:

door.listeners ('ochiq')

emitter.off ()

10-tugunga emitter.removeListener () uchun taxallus qo'shilgan.

emitter.on ()

Hodisa chiqqanda chaqirilgan qo'ng'iroqni qaytarish funktsiyasini qo'shadi.

Foydalanish:

door.on ('ochiq', () => {
  console.log ('Eshik ochildi')
})

emitter.once ()

Ro'yxatga olgandan keyin birinchi marta voqea chiqqanda chaqiriladigan qo'ng'iroqni qaytarish funktsiyasini qo'shadi. Ushbu qo'ng'iroqni qaytarish faqat bir marta chaqiriladi, boshqa hech qachon.

const EventEmitter = zarur ('voqealar')
const ee = yangi EventEmitter ()
ee.once ('mening-voqeam', () => {
  // bir marta qo'ng'iroqni qaytarish funktsiyasi
})

emitter.prependListener ()

AddListener-dan foydalanib tinglovchilarni qo'shsangiz, tinglovchilar navbatiga oxirgi qo'shiladi va oxirgi deb nomlanadi. PrependListener-dan foydalanib, u boshqa tinglovchilar oldida qo'shiladi va chaqiriladi.

emitter.prependOnceListener ()

Bir marta ishlatib tinglovchilarni qo'shsangiz, tinglovchilar navbatiga oxirgi marta qo'shiladi va oxirgi deb nomlanadi. PrependOnceListener-dan foydalanib, u boshqa tinglovchilar oldida qo'shiladi va chaqiriladi.

emitter.removeAllListeners ()

Hodisa chiqaruvchisi ob'ektini ma'lum bir voqeani tinglayotgan barcha tinglovchilarni o'chiradi:

eshik.removeAllListeners ('ochiq')

emitter.removeListener ()

Muayyan tinglovchini olib tashlang. Siz buni qo'ng'iroqni qaytarish funktsiyasini o'zgaruvchiga qo'shib qo'yganingizda saqlashingiz mumkin, shuning uchun keyinroq unga murojaat qilishingiz mumkin:

const doSomething = () => {}
door.on ('ochiq', doSomething)
eshik.removeListener ('ochiq', doSomething)

emitter.setMaxListeners ()

EventListener ob'ektiga qo'shishi mumkin bo'lgan tinglovchilarning maksimal sonini belgilaydi, bu 10 ga o'rnatilgan, ammo ko'paytirilishi yoki kamaytirilishi mumkin:

Eshik.setMaxListeners (50)

Node.js http moduli

Node.js-ning http moduli HTTP serverini yaratish uchun foydali funktsiyalar va sinflar bilan ta'minlaydi. Bu Node.js tarmog'ining asosiy moduli.

Bunga quyidagilar kiradi:

const http = zarur ('http')

Modul ba'zi xususiyatlar va usullarni va ba'zi sinflarni taqdim etadi.

Xususiyatlari

http: METODLAR

Ushbu xususiyat qo'llab-quvvatlanadigan barcha HTTP usullarini ro'yxati:

> talab qilish ('http'). USULLAR
['ACL',
  'BIND',
  'TEKSHIRIB KO'RMOQ',
  'ULANMOQ',
  'KOPYA',
  "O'chirish",
  'GET',
  'BOSHQARU',
  'LINK',
  'LOCK',
  'M-SEARCH',
  'MERGE',
  "MKACTIVITY",
  "MKCALENDAR",
  'MKCOL',
  "KO'CHIRISH",
  'XABAR',
  'OPTIONS',
  'PATCH',
  'POST',
  'PROPFIND',
  'PROPPATCH',
  'PURGE',
  'PUT',
  'REBIND',
  'HISOBOT',
  'QIDIRMOQ',
  'SUBSCRIBE',
  'TRACE',
  'UNBIND',
  'UNLINK',
  "Qulfni ochish",
  'UNSUBSCRIBE']

http.STATUS_CODES

Bu xususiyat barcha HTTP holat kodlarini va ularning tavsiflarini ro'yxatlaydi:

> talab qilish ('http'). STATUS_CODES
{'100': 'Davom etish »,
  '101': 'Bir-biriga ulangan protokollar',
  '102': 'Ishlov berish',
  '200': 'OK',
  "201": "Yaratildi",
  '202': 'Qabul qilingan',
  "203": "Vakolatsiz ma'lumot",
  '204': 'Tarkib yo'q',
  '205': 'Kontentni asl holatiga qaytarish',
  '206': 'Qisman tarkib',
  '207': 'Ko'p holatli',
  '208': 'Allaqachon xabar berilgan',
  '226': 'IM ishlatilgan',
  '300': 'Bir nechta tanlov',
  '301': 'Doimiy ko'chib o'tdi',
  '302': 'Topildi',
  '303': 'Boshqalarga qarang',
  '304': 'O'zgartirilmagan',
  '305': 'Proksi-serverdan foydalanish',
  '307': 'Vaqtinchalik yo'naltirish',
  '308': 'Doimiy yo'naltirish',
  '400': 'Noto'g'ri talab',
  '401': 'Ruxsatsiz',
  '402': 'To'lov talab etiladi',
  '403': 'Taqiqlangan',
  '404 topilmadi',
  '405': 'Usulga ruxsat berilmagan',
  '406': 'Qabul qilinmaydi',
  '407': 'Proksi-server haqiqiyligini tekshirish talab etiladi',
  '408': 'Vaqtni talab qilish',
  '409': 'Ziddiyat',
  '410': 'Yo'q',
  '411': 'Uzunlik talab etiladi',
  '412': 'Old shart bajarilmadi',
  '413': 'Juda katta yuk',
  '414': 'URI juda uzun',
  '415': 'Qo'llab-quvvatlanmaydigan media turi',
  '416': 'Aralashib bo'lmaydigan oraliq',
  '417': 'Umid amalga oshmadi',
  '418': 'Men choynakman',
  '421': 'Noto'g'ri yo'llangan talab',
  '422': 'Ishlov berilmaydigan shaxs',
  '423': 'Qulflangan',
  '424': 'Muvaffaqiyatsiz qaramlik',
  '425': 'tartibsiz to'plam',
  '426': 'Yangilash talab etiladi',
  '428': 'Old shart shart',
  '429': 'Juda ko'p so'rovlar',
  '431': 'Sarlavha maydonlarini juda katta talab qilish',
  '451': 'Huquqiy sabablarga ko'ra mavjud emas',
  '500': 'Serverning ichki xatosi',
  '501': 'Amalga oshirilmagan',
  '502 noto'g'ri shlyuz',
  '503': 'Xizmat mavjud emas',
  '504': 'Darvoza vaqti tugadi',
  '505': 'HTTP versiyasi qo'llab-quvvatlanmaydi',
  '506': 'Shuningdek, turli xil variantlar ham muzokaralar olib boradi',
  '507': ​​'Saqlash etarli emas',
  '508': 'Loop aniqlandi',
  '509': 'o'tkazish qobiliyati cheklovi tugadi',
  '510': 'Kengaytirilmagan',
  '511': 'Tarmoq haqiqiyligini tekshirish talab etiladi'}

http.globalAgent

Agentlik ob'ektining global instantsiyasiga, http.Agentclass inventariga ishora qiladi.

U ulanishlar barqarorligini boshqarish va HTTP mijozlari uchun qayta foydalanish uchun ishlatiladi va Node.js HTTP tarmog'ining muhim tarkibiy qismidir.

Keyinchalik http.Agent klassi tavsifida.

Usullari

http.createServer ()

Http.Server sinfining yangi namunasini qaytaring.

Foydalanish:

const server = http.createServer ((req, res) => {
  // har bir so'rovni qayta chaqiruv yordamida bajaring
})

http.request ()

Serverga HTTP so'rovini yuboradi va http.ClientRequest klassining namunasini yaratadi.

http.get ()

Xuddi http.request () ga o'xshash, lekin avtomatik ravishda HTTP usulini GET ga o'rnatadi va req.end () avtomatik ravishda qo'ng'iroq qiladi.

Sinflar

HTTP moduli 5 ta sinfni o'z ichiga oladi:

  • http.Agent
  • http.ClientRequest
  • http.Server
  • http.ServerResponse
  • http.IncomingMessage

http.Agent

Node HTTP tugunlarining asosiy tarkibiy qismi bo'lgan HTTP mijozlari uchun ulanishlarning chidamliligi va qayta ishlatilishini boshqarish uchun http.Agent sinfining global namunasini yaratadi.

Ushbu ob'ekt serverga qilingan har bir so'rovning navbatga qo'yilganligiga va bitta rozetkaning qayta ishlatilishiga ishonch hosil qiladi.

Shuningdek, u rozetkaning pulini ushlab turadi. Bu ishlash sabablari uchun kalit.

http.ClientRequest

Http.request () yoki http.get () chaqirilganda http.ClientRequest ob'ekti yaratiladi.

Javob qabul qilinganda, javob hodisasi javob sifatida, http: IncomingMessage misolida, argument sifatida chaqiriladi.

Javobning qaytarilgan ma'lumotlarini ikki usulda o'qish mumkin:

  • javob.read () usuliga qo'ng'iroq qilishingiz mumkin
  • javob hodisalarini qayta ishlash vositasida ma'lumotlar uzatilishi uchun voqea tinglovchisini sozlashingiz mumkin.

http.Server

Ushbu sinf odatda http.createServer () dan foydalanib yangi server yaratishda tezlashtiriladi va qaytariladi.

Agar sizda server ob'ekti bo'lsa, uning usullariga kirish huquqiga ega bo'lasiz:

  • close () serverga yangi ulanishlarni qabul qilishni to'xtatadi
  • listen () HTTP serverini ishga tushiradi va ulanishlarni tinglaydi

http.ServerResponse

Http.Server tomonidan yaratilgan va so'raladigan hodisaga ikkinchi parametr sifatida yuborilgan.

Umumiy sifatida ma'lum va kod sifatida ishlatiladi res:

const server = http.createServer ((req, res) => {
  // res http.ServerResponse ob'ekti
})

Siz har doim ishlov beruvchida qo'ng'iroq qilishingiz mumkin bo'lgan usul end () bo'lib, u javobni yopadi, xabar to'liq va server uni mijozga yuborishi mumkin. Har bir javobda uni chaqirish kerak.

Ushbu usullar HTTP sarlavhalari bilan o'zaro ishlashda ishlatiladi:

  • getHeaderNames () allaqachon o'rnatilgan HTTP sarlavhalari nomlarini ro'yxatini olish
  • getHeaders () allaqachon o'rnatilgan HTTP sarlavhalarining nusxasini olish
  • setHeader ('headername', qiymat) HTTP sarlavhasini belgilaydi
  • getHeader ('headername') allaqachon o'rnatilgan HTTP sarlavhasini oladi
  • removeHeader ('headername') allaqachon o'rnatilgan HTTP sarlavhasini olib tashlaydi
  • agar javobda sarlavha o'rnatilgan bo'lsa, hasHeader ('headername') haqiqiy qiymatni qaytaradi
  • sarlavhalar allaqachon mijozga yuborilgan bo'lsa, headersSent () haqiqiy qiymatni qaytaradi

Sarlavhalarni qayta ishlaganingizdan so'ng ularni mijozga yuborishingiz mumkin javob.writeHead (), bu holat status kodini birinchi parametr, ixtiyoriy holat xabari va sarlavhalar ob'ekti sifatida qabul qiladi.

Javob tanasida mijozga ma'lumotlarni yuborish uchun siz yozuvdan () foydalanasiz. U buferlangan ma'lumotlarni HTTP javob oqimiga yuboradi.

Agar sarlavhalar hələ javob.writeHead () dan foydalanmagan holda yuborilgan bo'lsa, u holda sarlavhalar birinchi bo'lib status kodi va so'rovda ko'rsatilgan xabar bilan yuboriladi.

javob.statusCode = 500
response.statusMessage = 'Serverning ichki xatosi'

http.IncomingMessage

Http.IncomingMessage ob'ekti tomonidan yaratilgan:

  • So'rovni tinglash paytida http.Server
  • Javob berish hodisasini tinglashda http.ClientRequest

Undan javobga kirish uchun foydalanish mumkin:

  • statusCode va statusMessage usullari yordamida status
  • sarlavha usuli yoki rawHeaders yordamida sarlavhalar
  • O'zining usul usulidan foydalangan holda HTTP usuli
  • HttpVersion usuli yordamida HTTP versiyasi
  • URL manzili url usulidan foydalanib
  • soket usuli yordamida tagidagi rozetka

Ma'lumotlarga oqimlar orqali kirish mumkin, chunki http.IncomingMessage o'qiladigan oqim interfeysini amalga oshiradi.

Node.js oqimlari

Oqimlar Node.js dasturlarini quvvatlaydigan asosiy tushunchalardan biridir.

Ular o'qish / yozish fayllarini, tarmoq aloqalarini yoki har qanday turdagi oxir-oqibat ma'lumot almashishni samarali tarzda hal qilish usulidir.

Oqimlar Node.js uchun xos bo'lmagan tushuncha emas. Ular Unix operatsion tizimida o'nlab yillar oldin joriy etilgan va dasturlar bir-birlari bilan truboprovod operatori orqali o'zaro ta'sir o'tkazishlari mumkin (|).

Masalan, an'anaviy tarzda, dasturga faylni o'qishni aytganda, fayl boshidan oxirigacha xotiraga o'qiladi va keyin uni qayta ishlaysiz.

Oqimlardan foydalanib, siz uni parcha-parcha o'qiysiz, tarkibini xotirada saqlamasdan ishlaysiz.

Node.js oqim moduli barcha oqim API-larining asosini yaratadi.

Nega oqimlar?

Oqim asosan boshqa ishlov berish usullaridan foydalangan holda ikkita muhim ustunlikni ta'minlaydi:

  • Xotira samaradorligi: uni qayta ishlashdan oldin xotiraga katta hajmdagi ma'lumotlarni yuklashingiz shart emas
  • Vaqt samaradorligi: ma'lumotlarni yig'ish uchun barcha imkoniyatlarni ishga tushirishni kutishdan ko'ra, sizda mavjud bo'lgan zahoti ma'lumotlarni qayta ishlashni boshlash uchun kamroq vaqt ketadi.

Oqimga misol

Oddiy misol - bu diskdagi fayllarni o'qish.

Node.js fs modulidan foydalanib, siz http serveringizga yangi ulanish o'rnatilganda faylni o'qishingiz va unga HTTP orqali xizmat ko'rsatishingiz mumkin:

const http = zarur ('http')
const fs = zarur ('fs')
const server = http.createServer (funktsiya (req, res) {
  fs.readFile (__ dirname + '/data.txt', (xato, ma'lumotlar) => {
    qayta yuborish (ma'lumotlar)
  })
})
server.listen (3000)

readFile () faylning to'liq tarkibini o'qiydi va uni tugatgandan so'ng qo'ng'iroqni qaytarish funktsiyasini chaqiradi.

qayta qo'ng'iroq qilish paytida res.end (ma'lumotlar) fayl tarkibini HTTP mijoziga qaytaradi.

Agar fayl katta bo'lsa, operatsiya biroz vaqt talab etadi. Bu erda oqimlardan foydalangan holda yozilgan narsa:

const http = zarur ('http')
const fs = zarur ('fs')
const server = http.createServer ((req, res) => {
  const stream = fs.createReadStream (__ dirname + '/data.txt')
  oqim.pipe (res)
})
server.listen (3000)

Fayl to'liq o'qilishini kutishning o'rniga, biz HTTP mijoziga yuborishga tayyor ma'lumotlar to'plamini olishimiz bilanoq uni uzatishni boshlaymiz.

quvur()

Yuqoridagi misolda stream.pipe (res) liniyasi qo'llaniladi: fayl (oqim) da quvur () usuli chaqiriladi.

Ushbu kod nima qiladi? U manbani oladi va uni maqsadga yo'naltiradi.

Siz uni manba oqimida chaqirasiz, shuning uchun bu holda fayl oqimi HTTP javobiga yuboriladi.

Quvurning qaytish qiymati () usuli - bu maqsadga yo'naltirilgan oqim, bu bizga bir nechta quvurlarni () zanjirli qo'ng'iroqlarni amalga oshirishga imkon beradigan juda qulay narsa:

src.pipe (dest1) .pipe (dest2)

Ushbu konstruktsiya qilish bilan bir xil:

src.pipe (dest1)
dest1.pipe (dest2)

Oqim bilan ishlaydigan Node.js APIsi

O'zlarining afzalliklari tufayli ko'plab Node.js yadro modullari mahalliy oqim bilan ishlash imkoniyatlarini ta'minlaydi, xususan:

  • process.stdin stdin-ga ulangan oqimni qaytaradi
  • process.stdout stdout-ga ulangan oqimni qaytaradi
  • process.stderr stderr-ga ulangan oqimni qaytaradi
  • fs.createReadStream () faylga o'qiladigan oqimni yaratadi
  • fs.createWriteStream () faylga yoziladigan oqim yaratadi
  • net.connect () oqimga asoslangan ulanishni boshlaydi
  • http.request () yoziladigan oqim bo'lgan http.ClientRequest sinfining namunasini qaytaradi
  • zlib.createGzip () ma'lumotlarni gzip (siqish algoritmi) yordamida oqim
  • zlib.createGunzip () gzip oqimini dekompressiya qilish.
  • zlib.createDeflate () ma'lumotlarni deflate (siqish algoritmi) yordamida siqish
  • zlib.createInflate () deflyate oqimini dekompressiya qilish

Turli xil oqimlar

Oqimlarning to'rtta toifasi mavjud:

  • O'qish mumkin: siz quvur orqali uzatishingiz mumkin, lekin uni uzatmaysiz (ma'lumot olishingiz mumkin, lekin unga ma'lumot yubormaysiz). Siz ma'lumotlarni o'qiladigan oqimga o'tkazganingizda, iste'molchi ma'lumotlarni o'qiy boshlaguncha buferlanadi.
  • Yozilishi mumkin: siz quvurlar orqali uzatishingiz mumkin, lekin siz naychadan o'tolmaysiz (ma'lumotlarni yuborishingiz mumkin, ammo undan qabul qila olmaysiz).
  • Dupleks: siz ikkala quvurni ham trubkadan o'tkazishingiz mumkin bo'lgan oqim, asosan, o'qiladigan va yoziladigan oqim
  • Transformatsiya: Transformatsiya oqimi Dupleksga o'xshaydi, ammo chiqish uning kirishining aylanishidir

O'qiladigan oqim qanday yaratiladi

Oqimli moduldan Readable oqimini olamiz va uni ishga tushiramiz:

const Stream = zarur ('oqim')
const readableStream = yangi Stream.Readable ()

Endi oqim ishga tushirildi, biz unga ma'lumotlarni yuborishimiz mumkin:

readableStream.push ("salom!")
readableStream.push ('ho!')

Yoziladigan oqim qanday yaratiladi

Yozib olinadigan oqim yaratish uchun biz Writing ob'ektining bazasini kengaytiramiz va uning _write () usulini qo'llaymiz.

Avval oqim ob'ekti yarating:

const Stream = zarur ('oqim')
const writableStream = yangi Stream.Writable ()

keyin _write-ni amalga oshiring:

writableStream._write = (to'plam, kodlash, keyingi) => {
    konsol.log (chunk.toString ())
    Keyingi()
}

Endi siz o'qiladigan oqimni uzatishingiz mumkin:

process.stdin.pipe (WritableStream)

O'qiladigan oqimdan ma'lumotlarni qanday olish

O'qiladigan oqimdan ma'lumotlarni qanday o'qiymiz? Yozib olinadigan oqimdan foydalanish:

const Stream = zarur ('oqim')
const readableStream = yangi Stream.Readable ()
const writableStream = yangi Stream.Writable ()
writableStream._write = (to'plam, kodlash, keyingi) => {
    konsol.log (chunk.toString ())
    Keyingi()
}
readableStream.pipe (WritableStream)
readableStream.push ("salom!")
readableStream.push ('ho!')

O'qish mumkin bo'lgan hodisadan foydalanib, siz to'g'ridan-to'g'ri o'qiladigan oqimni iste'mol qilishingiz mumkin:

readableStream.on ('o'qilishi mumkin', () => {
  konsol.log (readableStream.read ())
})

Ma'lumotni yoziladigan oqimga qanday yuborish kerak

Streaming write () metodidan foydalanib:

WritableStream.write ('hey! \ n')

Siz yozishni tugatgan yoziladigan oqim haqida signal

End () usulidan foydalaning:

const Stream = zarur ('oqim')
const readableStream = yangi Stream.Readable ()
const writableStream = yangi Stream.Writable ()
writableStream._write = (to'plam, kodlash, keyingi) => {
    konsol.log (chunk.toString ())
    Keyingi()
}
readableStream.pipe (WritableStream)
readableStream.push ("salom!")
readableStream.push ('ho!')
WritingStream.end ()

MySQL va Node.js bilan ishlash asoslari

MySQL dunyodagi eng mashhur ma'lumotlar bazalaridan biridir.

Node.js ekotizimida MySQL bilan interfeysga kirish, ma'lumotlarni saqlash, ma'lumotlarni olish va hokazolarga imkon beradigan bir nechta turli xil paketlar mavjud.

Biz mysqljs / mysql dan foydalanamiz, 12000 dan ortiq GitHub yulduzlari mavjud va yillar davomida mavjud.

Node.js MySql paketini o'rnatish

Siz uni quyidagilar yordamida o'rnatasiz:

npm mysql-ni o'rnatish

Ma'lumotlar bazasiga ulanishni boshlash

Avval paketni kiritasiz:

const mysql = talab qilish ('mysql')

va siz ulanishni yaratasiz:

const parametrlari = {
  foydalanuvchi: 'the_mysql_user_name',
  parol: 'the_mysql_user_password',
  ma'lumotlar bazasi: 'the_mysql_database_name'
}
const connection = mysql.createConnection (tanlovlar)

Siz quyidagi raqamga qo'ng'iroq qilib yangi ulanishni o'rnatasiz:

connection.connect (err => {
  agar (xato) {
    console.error ('Ma'lumotlar bazasiga ulanishda xato yuz berdi')
    otish adash
  }
})

Ulanish parametrlari

Yuqoridagi misolda optsiyalar ob'ekti 3 variantni o'z ichiga olgan:

const parametrlari = {
  foydalanuvchi: 'the_mysql_user_name',
  parol: 'the_mysql_user_password',
  ma'lumotlar bazasi: 'the_mysql_database_name'
}

Siz foydalanishingiz mumkin bo'lgan ko'p narsalar mavjud, shu jumladan:

  • host, ma'lumotlar bazasi xost nomi, localhost uchun standart
  • port, MySQL serverining port raqami, asl qiymati 3306
  • socketPath, xost va port o'rniga unix soketini belgilash uchun ishlatiladi
  • disk raskadrovka uchun standart nogiron sifatida foydalanish mumkin
  • iz, sukut bo'yicha yoqilgan bo'lsa, xatolar yuzaga kelganda stack izlarini bosib chiqaradi
  • serverga SSL ulanishni sozlash uchun ishlatiladigan ssl (ushbu qo'llanma doirasidan tashqarida)

SELECT so'rovini bajaring

Endi siz ma'lumotlar bazasida SQL so'rovini bajarishga tayyormiz. Bir marta bajarilgan so'rov, orqaga qaytish funktsiyasini chaqiradi, unda yuzaga keladigan xato, natijalar va maydonlar mavjud:

connection.query ('TODOSNI TO'G'RISIDA' TODOS ', (xato, todos, maydonlar) => {
  if (xato) {
    console.error ('So'rovni bajarishda xatolik yuz berdi')
    otish xatosi
  }
  konsol.log (todos)
})

Siz avtomatik ravishda qochib qutuladigan qiymatlarga o'tishingiz mumkin:

const id = 223
connection.query ('SELECT * FROM todos qaerda id =?', [id], (xato, todos, maydonlar) => {
  if (xato) {
    console.error ('So'rovni bajarishda xatolik yuz berdi')
    otish xatosi
  }
  konsol.log (todos)
})

Bir nechta qiymatlarni berish uchun, ikkinchi parametr sifatida berilgan qatorga qo'shimcha elementlarni qo'yish kifoya:

const id = 223
const muallif = 'Flavio'
connection.query ('SELECT * FROM todos qaerda id =? VA muallif =?', [id, muallif], (xato, todos, maydonlar) => {
  if (xato) {
    console.error ('So'rovni bajarishda xatolik yuz berdi')
    otish xatosi
  }
  konsol.log (todos)
})

INSERT so'rovini bajaring

Siz ob'ektni o'tkazishingiz mumkin:

const todo = {
  narsa: "sut sotib oling"
  muallif: 'Flavio'
}
connection.query ('INSERT INTO todos SET?', todo, (xato, natijalar, maydonlar) => {
  if (xato) {
    console.error ('So'rovni bajarishda xatolik yuz berdi')
    otish xatosi
  }
})

Agar jadvalda auto_increment asosiy kaliti bo'lsa, u holda natijalar qaytariladi.insertIdvalue:

const todo = {
  narsa: "sut sotib oling"
  muallif: 'Flavio'
}
connection.query ('INSERT INTO todos SET?', todo, (xato, natijalar, maydonlar) => {
  if (xato) {
    console.error ('So'rovni bajarishda xatolik yuz berdi')
    otish xatosi
  }}
  const id = natijalar.resultId
  konsol.log (id)
)

Ulanishni yoping

Ma'lumotlar bazasiga ulanishni to'xtatishingiz kerak bo'lsa, end () usuliga qo'ng'iroq qilishingiz mumkin:

connection.end ()

Bu kutilgan har qanday so'rov yuborilganiga va ulanish yaxshi yakunlanganiga ishonch hosil qiladi.

Rivojlanish va ishlab chiqarish o'rtasidagi farq

Siz ishlab chiqarish va rivojlanish muhiti uchun turli xil konfiguratsiyalarga ega bo'lishingiz mumkin.

Node.js har doim rivojlanish muhitida ishlaydi deb taxmin qiladi. Siz ishlab chiqarishda ishlayotgan Node.js-ga NODE_ENV = productionen environment o'zgaruvchisini o'rnatish orqali signal berishingiz mumkin.

Odatda bu buyruqni bajarish bilan amalga oshiriladi:

eksport NODE_ENV = ishlab chiqarish

qobiq ichida, lekin uni qobiq konfiguratsiya faylingizga (masalan, Bash qobig'i bilan .bash_profile) joylashtirganingiz ma'qul, chunki aks holda tizim qayta ishga tushirilganda sozlama saqlanib qolmaydi.

Atrof muhit o'zgaruvchisini dasturni boshlash buyrug'iga qo'shib qo'llashingiz mumkin:

NODE_ENV = ishlab chiqarish tugmasi app.js

Ushbu muhit o'zgaruvchisi tashqi kutubxonalarda ham keng qo'llaniladigan konvensiya.

Atrof-muhitni ishlab chiqarishga o'rnatish odatda quyidagilarni ta'minlaydi:

  • jurnalni yuritish minimal darajaga qadar saqlanadi
  • ish faoliyatini optimallashtirish uchun ko'proq keshlash darajasi amalga oshiriladi

Masalan, NugE_ENV ishlab chiqarilmagan bo'lsa, Express tomonidan ishlatiladigan shablon kutubxonasi Pug, tuzatish rejimida kompilyatsiya qiladi. Ekspress-qarashlar har bir so'rovda ishlab chiqish rejimida tuziladi, ishlab chiqarishda esa ular saqlanadi. Yana ko'plab misollar mavjud.

Express NODE_ENV o'zgaruvchan qiymati asosida avtomatik ravishda chaqiriladigan atrof-muhitga xos konfiguratsiya kancalarini beradi:

app.configure ('ishlab chiqish', () => {
  // ...
})
app.configure ('ishlab chiqarish', () => {
  // ...
})
app.configure ('ishlab chiqarish', 'sahnalashtirish', () => {
  // ...
})

Masalan, siz turli xil holatlar uchun turli xil xatolarga ishlov beruvchilarni o'rnatishda foydalanishingiz mumkin:

app.configure ('rivojlantirish', () => {
  app.use (express.errorHandler ({dumpExceptions: true, showStack: true}));
})
app.configure ('ishlab chiqarish', () => {
  app.use (express.errorHandler ())
})

Yakunlovchi so'zlar

Node.js-ga kirish sizga uni ishlatishni boshlashingizga yoki ba'zi tushunchalarni tushunishingizga yordam beradi deb umid qilaman. Va umid qilamanki, endi siz ajoyib narsalarni yaratishni boshlash uchun etarli ma'lumotga ega bo'lasiz!