1-bo‘lim
Node.js bilan tanishuv
Node.js ni kim va nima uchun yaratgan, nomi qayerdan kelgan, brauzerdagi JavaScript dan farqi va bloklamaydigan kirish-chiqish nima.
Ushbu bo‘lim mundarijasi
Node.js - JavaScript ni brauzerdan tashqarida ishlatish imkonini beradigan muhit. U bilan server, buyruq qatori vositasi yoki fayllar bilan ishlaydigan dastur yozish mumkin.
Bu darslik siz JavaScript ni bilasiz deb hisoblaydi. Agar hali o'rganmagan bo'lsangiz, avval JavaScript asoslari darsligidan boshlang.
Birinchi dastur #
const shahar = "Namangan";
const asosiy = Number(process.versions.node.split(".")[0]);
console.log(`Salom, ${shahar}!`);
console.log("Node versiyasi katta:", asosiy >= 18);
Salom, Namangan!
Node versiyasi katta: true
Faylni salom.js deb saqlab, shunday ishga tushirasiz:
node salom.js
console.log tanish, lekin process - yangi. U brauzerda yo'q.
Brauzer va Node farqi #
| Brauzerda bor | Node da bor |
|---|---|
window, document | process, global |
| DOM va hodisalar | Fayl tizimi (fs) |
localStorage | Muhit o'zgaruvchilari |
| Sahifa bilan cheklangan | Butun kompyuterga kirish |
Ikkalasida ham bir xil narsa: til. const, map, async/await,
sinflar - hammasi aynan bir xil ishlaydi.
console.log(typeof window);
console.log(typeof document);
console.log(typeof process);
console.log(typeof globalThis);
undefined
undefined
object
object
Brauzer uchun yozilgan kodni Node ga ko'chirsangiz va u
document.querySelector ishlatsa, dastur darhol to'xtaydi.
Buning teskarisi ham to'g'ri: fs moduli brauzerda yo'q - veb-sahifa
foydalanuvchining fayllarini o'qiy olmasligi kerak.
Ikkalasida ham ishlaydigan kod yozmoqchi bo'lsangiz, faqat tilning
o'zidan foydalaning: globalThis - ikkalasida ham mavjud bo'lgan
yagona global nom.
Nomi qayerdan kelgan #
Rayan Dal loyihani dastlab web.js deb atagan - u oddiy veb-server
yozmoqchi edi.
Lekin ish davom etgani sari maqsad kengaydi: bu faqat veb-server emas, balki tarmoqdagi istalgan dasturni yozish uchun muhit edi.
Shunda nom ham o'zgardi. G'oya shunday: har bir Node dasturi - tarmoqdagi bitta tugun (node). Katta tizim ko'p tugundan yig'iladi, ular esa bir-biri bilan aloqa qiladi.
.js qo'shimchasi esa bu JavaScript ekanini bildiradi.
Uni kim yaratgan #
Rayan Dal (1981-)
Node.js ning yaratuvchisi. Amerikalik dasturchi. U Node ni 2009-yil noyabrda Berlindagi `JSConf EU` anjumanida birinchi marta namoyish qilgan.
Uni bitta muammo bezovta qilardi: o'sha davr serverlari har bir ulanish uchun alohida **oqim** (thread) ajratardi. Ming foydalanuvchi - ming oqim, va har biri xotira yeydi. Bundan tashqari, server fayldan o'qiyotganda o'sha oqim shunchaki **kutib** turardi.
Uning javobi: bitta oqim, lekin hech qachon kutmaydigan. Buni 12-bo'limda emas, aynan quyida ko'ramiz.
Dal 2012-yilda loyihadan chetlashdi va keyinroq o'z tajribasidan kelib chiqib Deno muhitini yaratdi.
Ayzek Shlyuter
npm ning yaratuvchisi. 2010-yilda u Node uchun paket menejerini yozdi - bugun dunyodagi eng katta ochiq kod ombori.
Aynan npm Node ning tarqalishiga sabab bo'ldi: begona kodni ishlatish bitta buyruqqa aylandi. Uni 4-bo'limda o'rganamiz.
Vaqt chizig'i #
2014-yilda Node jamoasida kelishmovchilik chiqdi: rivojlanish juda sekin ketayotgani va qarorlar bitta kompaniya qo'lida ekani ko'pchilikni qoniqtirmasdi.
Bir guruh ishlab chiquvchilar loyihaning nusxasini olib, uni io.js deb atashdi va tezroq rivojlantira boshlashdi.
Ajralish uzoqqa cho'zilmadi. 2015-yilda ikki loyiha qayta birlashdi va
mustaqil Node.js Foundation tuzildi - endi hech bir kompaniya
yakka hokim emas edi. 2019-yilda u OpenJS Foundation ga aylandi.
Shuning uchun Node ning versiyalari 0.12 dan keyin darhol 4.0 ga sakragan: io.js allaqachon 3.x da edi.
Bloklamaydigan kirish-chiqish #
Node ning asosiy g'oyasi shu. Uni ko'rib chiqamiz.
import { readFile } from "node:fs/promises";
console.log("1. fayl so'raldi");
const vada = readFile(new URL(import.meta.url));
console.log("2. bu qator kutmadi");
const mazmun = await vada;
console.log("3. fayl keldi, bo'sh emas:", mazmun.length > 0);
1. fayl so'raldi
2. bu qator kutmadi
3. fayl keldi, bo'sh emas: true
Ikkinchi qator fayl o'qilishini kutmadi. Node so'rovni operatsion tizimga topshirdi va darhol keyingi ishga o'tdi.
Endi bloklaydigan shaklini ko'ramiz:
import { readFileSync } from "node:fs";
console.log("1. fayl so'raldi");
const mazmun = readFileSync(new URL(import.meta.url));
console.log("2. bu qator kutdi");
console.log("3. fayl bo'sh emas:", mazmun.length > 0);
1. fayl so'raldi
2. bu qator kutdi
3. fayl bo'sh emas: true
Tartib bir xil ko'rinadi, lekin ichkarida katta farq bor: bu safar ikkinchi qator fayl to'liq o'qilgunicha umuman ishlamadi.
Node ning kuchi ham, zaifligi ham shu: bitta asosiy oqim.
Kutish (fayl, tarmoq, ma'lumotlar bazasi) hech narsa turmaydi - u tizimga topshiriladi.
Lekin hisob boshqacha. Agar kodingiz bir soniya davomida uzluksiz hisoblasa, o'sha soniyada server hech kimga javob bera olmaydi - hamma foydalanuvchi kutib turadi.
Shuning uchun Node og'ir hisob uchun eng yaxshi tanlov emas. Uning o'rni - ko'p kutish va kam hisob bo'lgan ishlar: API, veb-server, fayllar bilan ishlash. Aynan veb-xizmatlarning ko'pchiligi shunday.
Node qayerda ishlatiladi #
| Qayerda | Nima uchun |
|---|---|
| REST va GraphQL API | Ko'p so'rov, kam hisob |
| Real vaqt ilovalari | Chat, bildirishnoma, o'yin |
| Buyruq qatori vositalari | npm, eslint, vite |
| Front-end qurish | Bundlerlar Node da ishlaydi |
| Mikroservislar | Tez ishga tushadi, kam xotira |
Diqqat qiling: front-end dasturchi bo'lsangiz ham, Node ni allaqachon
ishlatgansiz. React, Vue yoki Vite loyihasini qurish - bu Node
da ishlaydigan dastur.
V8 va libuv #
Node - til emas, balki muhit. U ikki katta qismdan yig'ilgan:
- V8 - Google ning JavaScript dvigateli,
Chromeda ham ishlatiladi. U kodni o'qiydi va mashina tiliga aylantiradi. - libuv - C tilida yozilgan kutubxona. U hodisalar sikli va bloklamaydigan kirish-chiqishni ta'minlaydi.
libuv aynan Node uchun yozilgan, keyinchalik esa alohida loyihaga
ajratilgan va boshqa tillar ham undan foydalanadi.
Bundan tashqari Node standart kutubxonani beradi: fs, http,
path, crypto va boshqalar. Ularning ko'pi C++ da yozilgan va
JavaScript ga ochilgan.
Versiyani tekshirish #
const [asosiy] = process.versions.node.split(".").map(Number);
console.log("Node 18 dan yangimi:", asosiy >= 18);
console.log("V8 mavjud:", typeof process.versions.v8 === "string");
console.log("Platformalardan biri:",
["linux", "darwin", "win32"].includes(process.platform));
Node 18 dan yangimi: true
V8 mavjud: true
Platformalardan biri: true
process.versions.node sizda boshqacha bo'ladi - masalan 22.14.0.
Agar shuni chiqarsak, bu darslikdagi kutilgan natija sizda mos
kelmasdi.
Shuning uchun bu darslikdagi hamma misol barqaror natija beradi: o'zgaruvchan qiymatlar o'rniga taqqoslash natijasi chiqariladi.
Xuddi shu sabab bilan bu yerda hech qachon Math.random(),
Date.now() yoki papkadagi fayllar tartibi to'g'ridan-to'g'ri
chop etilmaydi.
- Node ni o'rnatib,
node --versionbilan tekshiring. salom.jsfaylini yozib,node salom.jsbilan ishga tushiring.console.log(typeof window)yozib, natijani ko'ring.process.platformvaprocess.versionsni chiqaring.- Brauzerdagi
documentga murojaat qilib, xatoni o'qing. readFilebilan bloklamaydigan o'qishni sinang.- Xuddi shuni
readFileSyncbilan qayta yozing. - Ikkalasining tartibiga e'tibor bering.
- Node qaysi mashhur vositalarda ishlatilishini bilib oling.
- io.js tarixini qisqacha o'qing.
Xulosa #
- Node.js - til emas, muhit: JavaScript ni brauzerdan tashqarida ishlatadi.
- Uni Rayan Dal 2009-yilda yaratgan; sabab - har ulanishga bitta oqim ajratadigan serverlarning qimmatligi.
- Nomi "tarmoqdagi bitta tugun" degan g'oyadan kelgan.
- Node da
windowvadocumentyo'q, lekinprocessvafsbor. - npm ni 2010-yilda Ayzek Shlyuter yozgan.
- 2014-yilgi io.js ajralishi 2015-yilda birlashuv va mustaqil jamg'arma bilan yakunlandi.
- Node bitta oqimda ishlaydi: kutishni tizimga topshiradi, lekin og'ir hisob butun serverni bloklaydi.
- U V8 dvigateli va libuv kutubxonasi ustiga qurilgan.
Keyingi bo'limda Node ni o'rnatib, birinchi loyihani yaratamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.