Veb Ishlash Ko'rsatkichlari API'larini chuqur o'rganish: an'anaviy vaqt o'lchovlaridan Core Web Vitals kabi zamonaviy metrikalargacha va ishlashning yaxlit ko'rinishi uchun ularni qanday bog'lash.
Vaqtdan tashqari: Veb Ishlash Ko'rsatkichlari API'larini Haqiqiy Foydalanuvchi Tajribasi bilan Bog'lash
Raqamli iqtisodiyotda tezlik shunchaki xususiyat emas; bu foydalanuvchi tajribasining asosidir. Sekin veb-sayt hafsalasi pir bo'lgan foydalanuvchilarga, yuqori "bounce rate" (darhol chiqib ketish) ko'rsatkichlariga va daromadga bevosita salbiy ta'sirga olib kelishi mumkin. Yillar davomida dasturchilar ishlash ko'rsatkichlarini baholash uchun window.onload
kabi vaqt o'lchovlariga tayanishgan. Ammo tez yuklanish vaqti haqiqatan ham mamnun foydalanuvchiga tengmi? Javob ko'pincha "yo'q" bo'ladi.
Sahifa barcha texnik resurslarini bir soniyadan kamroq vaqt ichida yuklab bo'lishi mumkin, ammo u bilan o'zaro aloqada bo'lishga harakat qilayotgan haqiqiy odam uchun sekin va foydalanishga yaroqsiz bo'lib tuyulishi mumkin. Bu nomuvofiqlik veb-dasturlashdagi muhim evolyutsiyani ko'rsatadi: texnik vaqtni o'lchashdan inson tajribasini miqdoriy baholashga o'tish. Zamonaviy veb ishlashi ikki nuqtai nazarning hikoyasidir: Veb Ishlash Ko'rsatkichlari API'lari tomonidan taqdim etilgan batafsil, past darajadagi ma'lumotlar va Google'ning Core Web Vitals kabi yuqori darajadagi, foydalanuvchiga yo'naltirilgan metrikalar.
Ushbu keng qamrovli qo'llanma ushbu bo'shliqni to'ldiradi. Biz diagnostika vositalarimiz sifatida xizmat qiladigan kuchli Veb Ishlash Ko'rsatkichlari API'lari to'plamini o'rganamiz. Keyin, ishlashning *qanday his qilinishini* aytib beradigan zamonaviy foydalanuvchi tajribasi metrikalariga chuqurroq kirib boramiz. Eng muhimi, biz nuqtalarni bog'laymiz va global auditoriyangiz uchun yomon foydalanuvchi tajribasining asl sabablarini tashxislash va tuzatish uchun past darajadagi vaqt ma'lumotlaridan qanday foydalanishni ko'rsatamiz.
Asos: Veb Ishlash Ko'rsatkichlari API'larini Tushunish
Veb Ishlash Ko'rsatkichlari API'lari - bu dasturchilarga veb-sahifaning navigatsiyasi va renderlanishi bilan bog'liq juda batafsil va aniq vaqt ma'lumotlariga kirish imkonini beruvchi standartlashtirilgan brauzer interfeyslari to'plamidir. Ular ishlashni o'lchashning asosidir, bu bizga oddiy sekundomerlardan tashqariga chiqib, tarmoq so'rovlari, tahlil qilish va renderlashning murakkab raqsini tushunishga imkon beradi.
Navigation Timing API: Sahifaning Sayohati
Navigation Timing API (Navigatsiya Vaqti API) asosiy hujjatni yuklash uchun ketadigan vaqtning batafsil tahlilini taqdim etadi. U foydalanuvchi navigatsiyani boshlagan paytdan (masalan, havolani bosish) sahifa to'liq yuklanguncha bo'lgan muhim bosqichlarni qayd etadi. Bu sahifa yuklanish jarayoniga bizning birinchi va eng asosiy qarashimizdir.
Siz ushbu ma'lumotlarga oddiy JavaScript chaqiruvi bilan kirishingiz mumkin:
const navigationEntry = performance.getEntriesByType('navigation')[0];
console.log(navigationEntry.toJSON());
Bu vaqt belgilari bilan to'la obyektni qaytaradi. Ba'zi asosiy xususiyatlar quyidagilarni o'z ichiga oladi:
- fetchStart: Brauzer hujjatni yuklashni boshlagan vaqt.
- responseStart: Brauzer serverdan javobning birinchi baytini olgan vaqt.
fetchStart
varesponseStart
orasidagi vaqt ko'pincha Birinchi Baytgacha Bo'lgan Vaqt (TTFB) deb ataladi. - domContentLoadedEventEnd: Uslublar jadvallari, rasmlar va pastki freymlarning yuklanishini kutmasdan, dastlabki HTML hujjati to'liq yuklangan va tahlil qilingan vaqt.
- loadEventEnd: Sahifaning barcha resurslari (jumladan, rasmlar, CSS va boshqalar) to'liq yuklangan vaqt.
Uzoq vaqt davomida loadEventEnd
oltin standart hisoblangan. Biroq, uning cheklovi jiddiy: u foydalanuvchi mazmunli kontentni *ko'rgan* yoki sahifa bilan *o'zaro aloqada bo'lishi* mumkin bo'lgan vaqt haqida hech narsa demaydi. Bu insoniy emas, balki texnik bosqichdir.
Resource Timing API: Komponentlarni Tahlil Qilish
Veb-sahifa kamdan-kam hollarda bitta fayldan iborat bo'ladi. Bu HTML, CSS, JavaScript, rasmlar, shriftlar va API chaqiruvlarining yig'indisidir. Resource Timing API (Resurs Vaqti API) sizga ushbu alohida resurslarning har biri uchun tarmoq vaqtini tekshirish imkonini beradi.
Bu muammoli joylarni aniqlash uchun nihoyatda kuchli vositadir. Boshqa qit'adagi Kontent Yetkazib Berish Tarmog'idan (CDN) kelayotgan katta, optimallashtirilmagan asosiy rasm dastlabki renderlashni sekinlashtiryaptimi? Uchinchi tomon tahlil skripti asosiy oqimni to'sib qo'yayaptimi? Resurs Vaqti bu savollarga javob berishga yordam beradi.
Siz barcha resurslar ro'yxatini quyidagicha olishingiz mumkin:
const resourceEntries = performance.getEntriesByType('resource');
resourceEntries.forEach(resource => {
if (resource.duration > 200) { // 200ms dan uzoqroq davom etgan resurslarni topish
console.log(`Sekin resurs: ${resource.name}, Davomiyligi: ${resource.duration}ms`);
}
});
Asosiy xususiyatlarga name
(resursning URL manzili), initiatorType
(resursning yuklanishiga sabab bo'lgan narsa, masalan, 'img', 'script') va duration
(uni yuklash uchun ketgan umumiy vaqt) kiradi.
User Timing API: Ilovangiz Mantig'ini O'lchash
Ba'zan ishlashdagi muammo aktivlarni yuklashda emas, balki mijoz tomonidagi kodning o'zida bo'ladi. Sizning bir sahifali ilovangiz (SPA) API'dan ma'lumotlar olingandan so'ng murakkab komponentni renderlashi uchun qancha vaqt ketadi? User Timing API (Foydalanuvchi Vaqti API) sizga maxsus, ilovaga xos o'lchovlarni yaratish imkonini beradi.
U ikkita asosiy usul bilan ishlaydi:
- performance.mark(name): Ishlash buferida nomlangan vaqt belgisini yaratadi.
- performance.measure(name, startMark, endMark): Ikki belgi orasidagi davomiylikni hisoblaydi va nomlangan o'lchovni yaratadi.
Misol: Mahsulotlar ro'yxati komponentining render vaqtini o'lchash.
// Ma'lumotlarni olishni boshlaganingizda
performance.mark('product-list-fetch-start');
fetch('/api/products')
.then(response => response.json())
.then(data => {
// Olgandan so'ng, renderlashdan oldin
performance.mark('product-list-render-start');
renderProductList(data);
// Renderlash tugashi bilan darhol
performance.mark('product-list-render-end');
// O'lchov yaratish
performance.measure(
'Product List Render Time',
'product-list-render-start',
'product-list-render-end'
);
});
Bu sizga foydalanuvchining ish jarayoni uchun eng muhim bo'lgan ilovangiz qismlarini o'lchash uchun aniq nazoratni beradi.
PerformanceObserver: Zamonaviy, Samarali Yondashuv
Doimiy ravishda `performance.getEntriesByType()` ni so'rab turish samarasizdir. `PerformanceObserver` API ishlash yozuvlarini tinglashning ancha yaxshi usulini taqdim etadi. Siz ma'lum yozuv turlariga obuna bo'lasiz va brauzer ular qayd etilishi bilan asinxron tarzda qayta aloqa funksiyangizni xabardor qiladi. Bu ilovangizga ortiqcha yuk qo'shmasdan ishlash ma'lumotlarini to'plashning tavsiya etilgan usulidir.
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
console.log(`Yozuv turi: ${entry.entryType}, Nomi: ${entry.name}`);
}
});
observer.observe({ entryTypes: ['resource', 'navigation', 'mark', 'measure'] });
Ushbu kuzatuvchi nafaqat yuqoridagi an'anaviy metriklarni, balki keyin muhokama qiladigan zamonaviy, foydalanuvchiga yo'naltirilgan metriklarni ham to'plashning kalitidir.
Foydalanuvchiga Yo'naltirishga O'tish: Core Web Vitals
Sahifaning 2 soniyada yuklanganini bilish foydali, lekin bu muhim savollarga javob bermaydi: Foydalanuvchi shu 2 soniya davomida bo'sh ekranga tikilib turdimi? Ular sahifa bilan o'zaro aloqada bo'la oldimi yoki u muzlab qolganmidi? Ular o'qishga harakat qilganda kontent kutilmaganda sakrab ketdimi?
Buni hal qilish uchun Google Core Web Vitals (CWV) ni taqdim etdi - bu sahifaning haqiqiy foydalanuvchi tajribasini uchta asosiy yo'nalishda o'lchash uchun mo'ljallangan metrikalar to'plami: yuklanish, interaktivlik va vizual barqarorlik.
Largest Contentful Paint (LCP): Idrok Etilgan Yuklanishni O'lchash
LCP ko'rinish maydonidagi eng katta rasm yoki matn blokining render vaqtini o'lchaydi. Bu foydalanuvchi sahifaning asosiy mazmuni yuklanganini his qilgan vaqt uchun ajoyib proksi vazifasini o'taydi. U to'g'ridan-to'g'ri foydalanuvchining savoliga javob beradi: "Bu sahifa hali foydalimi?"
- Yaxshi: 2.5 soniyadan past
- Yaxshilash kerak: 2.5s va 4.0s orasida
- Yomon: 4.0 soniyadan yuqori
`loadEventEnd` dan farqli o'laroq, LCP foydalanuvchi birinchi navbatda nimani ko'rishiga e'tibor qaratadi, bu esa uni idrok etilgan yuklanish tezligining ancha aniqroq aks ettiradi.
Interaction to Next Paint (INP): Javob Qaytarish Tezligini O'lchash
INP First Input Delay (FID) ning vorisi bo'lib, 2024-yil mart oyida rasmiy Core Web Vital'ga aylandi. FID faqat *birinchi* o'zaro ta'sirning kechikishini o'lchagan bo'lsa, INP sahifaning butun hayotiy davri davomida *barcha* foydalanuvchi o'zaro ta'sirlarining (bosish, teginish, klaviatura bosishlari) kechikishini o'lchaydi. U eng uzoq davom etgan o'zaro ta'sirni xabar qiladi va foydalanuvchi boshdan kechirgan eng yomon javob qaytarish holatini aniqlaydi.
INP foydalanuvchining kiritishidan keyingi kadr chizilguncha bo'lgan butun vaqtni o'lchaydi, bu vizual fikr-mulohazani aks ettiradi. U foydalanuvchining savoliga javob beradi: "Men bu tugmani bosganimda, sahifa tez javob beradimi?"
- Yaxshi: 200 millisekunddan past
- Yaxshilash kerak: 200ms va 500ms orasida
- Yomon: 500ms dan yuqori
Yuqori INP odatda band bo'lgan asosiy oqim tufayli yuzaga keladi, bu yerda uzoq davom etadigan JavaScript vazifalari brauzerning foydalanuvchi kiritishiga javob berishiga to'sqinlik qiladi.
Cumulative Layout Shift (CLS): Vizual Barqarorlikni O'lchash
CLS sahifaning vizual barqarorligini o'lchaydi. U yuklanish jarayonida kontentning ekranda qanchalik kutilmaganda siljishini miqdoriy baholaydi. Yuqori CLS ko'rsatkichi foydalanuvchi noroziligining keng tarqalgan manbaidir, masalan, siz tugmani bosishga harakat qilganingizda, lekin uning ustida reklama yuklanib, tugmani pastga surib yuboradi va sizni reklama ustiga bosishga majbur qiladi.
CLS foydalanuvchining savoliga javob beradi: "Men bu sahifadan elementlar har tomonga sakramasdan foydalana olamanmi?"
- Yaxshi: 0.1 dan past
- Yaxshilash kerak: 0.1 va 0.25 orasida
- Yomon: 0.25 dan yuqori
Yuqori CLSning keng tarqalgan sabablari o'lchamlari ko'rsatilmagan rasmlar yoki iframe'lar, kech yuklanadigan veb-shriftlar yoki sahifaga dinamik ravishda joy ajratilmasdan kiritilgan kontentdir.
Bo'shliqni To'ldirish: Yomon Foydalanuvchi Tajribasini Tashxislash Uchun API'lardan Foydalanish
Bu yerda hamma narsa birlashadi. Core Web Vitals bizga foydalanuvchi *nimalarni* boshdan kechirganini aytadi (masalan, sekin LCP). Veb Ishlash Ko'rsatkichlari API'lari esa buning *nima uchun* sodir bo'lganini aytadi. Ularni birlashtirib, biz shunchaki ishlashni kuzatishdan uni faol ravishda tashxislash va tuzatishga o'tamiz.
Sekin LCP'ni Tashxislash
Sizning Haqiqiy Foydalanuvchi Monitoringi (RUM) vositangiz ma'lum bir mintaqadagi foydalanuvchilar uchun 4.5 soniyalik yomon LCP haqida xabar berayotganini tasavvur qiling. Buni qanday tuzatasiz? Siz LCP vaqtini uning tarkibiy qismlariga ajratishingiz kerak.
- Birinchi Baytgacha Bo'lgan Vaqt (TTFB): Server javob berishda sekin ishlayaptimi? Navigation Timing API dan foydalaning. `responseStart - requestStart` davomiyligi sizga aniq TTFB ni beradi. Agar bu yuqori bo'lsa, muammo frontendda emas, balki sizning backend, server konfiguratsiyasi yoki ma'lumotlar bazangizda.
- Resursni Yuklashning Kechikishi va Vaqti: LCP elementining o'zi sekin yuklanayaptimi? Birinchidan, LCP elementini aniqlang (masalan, asosiy rasm). Elementning o'zini olish uchun `'largest-contentful-paint'` uchun `PerformanceObserver` dan foydalanishingiz mumkin. Keyin, ushbu elementning URL manzili uchun yozuvni topish uchun Resource Timing API dan foydalaning. Uning vaqt jadvalini tahlil qiling: `connectStart` dan `connectEnd` gacha uzoq vaqt ketdimi (sekin tarmoq)? `responseStart` dan `responseEnd` gacha uzoq bo'ldimi (katta fayl hajmi)? Uning `fetchStart` i CSS yoki JavaScript kabi boshqa render-bloklovchi resurslar tomonidan to'sib qo'yilganligi sababli kechikdimi?
- Elementni Renderlash Kechikishi: Bu resurs yuklab bo'linganidan keyin u haqiqatda ekranda chizilguncha bo'lgan vaqt. Bu asosiy oqimning boshqa vazifalar bilan bandligi, masalan, katta JavaScript to'plamini bajarishi sababli yuzaga kelishi mumkin.
Navigation va Resource Timing'dan foydalanib, sekin LCP sekin server, render-bloklovchi skript yoki katta, optimallashtirilmagan rasm tufayli ekanligini aniqlay olasiz.
Yomon INP'ni Tekshirish
Foydalanuvchilaringiz "Savatga qo'shish" tugmasini bosish sekin his qilinayotganidan shikoyat qilmoqda. Sizning INP metrikangiz "Yomon" diapazonida. Bu deyarli har doim asosiy oqim muammosidir.
- Uzoq Vazifalarni Aniqlash: Long Tasks API bu yerda sizning asosiy vositangizdir. U asosiy oqimdagi 50 ms dan uzoqroq davom etadigan har qanday vazifa haqida xabar beradi, chunki bundan uzoqroq davom etadigan narsa foydalanuvchiga sezilarli kechikish xavfini tug'diradi. `'longtask'` yozuvlarini tinglash uchun `PerformanceObserver` ni sozlang.
- Foydalanuvchi Harakatlari bilan Bog'lash: Uzoq vazifa faqat foydalanuvchi o'zaro aloqada bo'lishga harakat qilayotganda yuzaga kelsa muammo hisoblanadi. Siz INP hodisasining `startTime` ini (`'event'` turi bo'yicha `PerformanceObserver` orqali kuzatiladi) bir vaqtning o'zida sodir bo'lgan har qanday uzoq vazifalarning vaqtlari bilan bog'lashingiz mumkin. Bu sizga aynan qaysi JavaScript funksiyasi foydalanuvchining o'zaro ta'sirini to'sib qo'yganini aytadi.
- Maxsus Ishlovchilarni O'lchash: Yanada batafsilroq ma'lumot olish uchun User Timing API dan foydalaning. O'zingizning muhim hodisa ishlovchilaringizni (masalan, "Savatga qo'shish" uchun 'click' ishlovchisi) `performance.mark()` va `performance.measure()` bilan o'rang. Bu sizning o'z kodingizning bajarilishi uchun qancha vaqt ketayotganini va u uzoq vazifaning manbai ekanligini aniq aytib beradi.
Yuqori CLS bilan Kurashish
Foydalanuvchilar mobil qurilmalarida maqola o'qiyotganda matn sakrab ketayotgani haqida xabar berishmoqda. Sizning CLS ko'rsatkichingiz 0.3.
- Layout Siljishlarini Kuzatish: `'layout-shift'` yozuvlarini tinglash uchun `PerformanceObserver` dan foydalaning. Har bir yozuvda `value` (uning CLS ko'rsatkichiga qo'shgan hissasi) va siljigan DOM elementlari bo'lgan `sources` ro'yxati bo'ladi. Bu sizga *nima* siljiganini aytadi.
- Aybdor Resursni Topish: Keyingi savol - *nima uchun* u siljidi. Keng tarqalgan sabab - resursning kech yuklanishi va boshqa kontentni pastga surib yuborishi. Siz `layout-shift` yozuvining `startTime` ini Resource Timing API dan olingan yozuvlarning `responseEnd` vaqti bilan bog'lashingiz mumkin. Agar layout siljishi reklama skripti yoki katta rasm yuklab bo'linganidan so'ng darhol sodir bo'lsa, siz o'z aybdoringizni topgan bo'lishingiz mumkin.
- Proaktiv Yechimlar: Tuzatish ko'pincha rasmlar va reklamalar uchun o'lchamlarni taqdim etishni (`
`) yoki dinamik kontent yuklanishidan oldin sahifada joy ajratishni o'z ichiga oladi. Resource Timing sizga qaysi resurslar bo'yicha proaktiv bo'lishingiz kerakligini aniqlashga yordam beradi.
Amaliy Amalga Oshirish: Global Monitoring Tizimini Qurish
Ushbu API'larni tushunish bir narsa; ularni global foydalanuvchi bazangiz tajribasini kuzatish uchun joylashtirish keyingi qadamdir. Bu Haqiqiy Foydalanuvchi Monitoringi (RUM) sohasidir.
Barchasini `PerformanceObserver` bilan Birlashtirish
Siz ushbu barcha muhim ma'lumotlarni to'plash uchun yagona, kuchli skript yaratishingiz mumkin. Maqsad - siz o'lchashga harakat qilayotgan ishlashga ta'sir qilmasdan metrikalar va ularning kontekstini to'plash.
Mana mustahkam kuzatuvchi sozlamasining konseptual parchasi:
const collectedMetrics = {};
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
if (entry.entryType === 'largest-contentful-paint') {
collectedMetrics.lcp = entry.startTime;
} else if (entry.entryType === 'layout-shift') {
collectedMetrics.cls = (collectedMetrics.cls || 0) + entry.value;
} else if (entry.entryType === 'event') {
// Bu INP hisoblashining soddalashtirilgan ko'rinishi
const duration = entry.duration;
if (duration > (collectedMetrics.inp || 0)) {
collectedMetrics.inp = duration;
}
}
// ... va 'longtask' kabi boshqa yozuv turlari uchun ham shunday davom etadi
}
});
observer.observe({ entryTypes: ['largest-contentful-paint', 'layout-shift', 'event', 'longtask'] });
Ma'lumotlarni Ishonchli Yuborish
Ma'lumotlaringizni to'plaganingizdan so'ng, ularni saqlash va tahlil qilish uchun tahlil backendiga yuborishingiz kerak. Buni sahifaning yopilishini kechiktirmasdan yoki o'z tablarini tezda yopadigan foydalanuvchilardan ma'lumotlarni yo'qotmasdan qilish juda muhim.
`navigator.sendBeacon()` API buning uchun mukammaldir. U sahifa yopilayotgan bo'lsa ham, serverga oz miqdordagi ma'lumotlarni yuborishning ishonchli, asinxron usulini taqdim etadi. U javob kutmaydi, bu uni yengil va bloklamaydigan qiladi.
window.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'hidden') {
const payload = JSON.stringify(collectedMetrics);
navigator.sendBeacon('/api/performance-analytics', payload);
}
});
Global Ko'rinishning Ahamiyati
Lighthouse kabi laboratoriya sinov vositalari bebaho, ammo ular nazorat ostidagi muhitda ishlaydi. Ushbu API'lardan to'plangan RUM ma'lumotlari sizga turli mamlakatlar, tarmoq sharoitlari va qurilmalardagi foydalanuvchilaringiz boshdan kechirayotgan haqiqiy vaziyatni aytib beradi.
Ma'lumotlaringizni tahlil qilganda, ularni har doim segmentlarga ajrating. Siz quyidagilarni aniqlashingiz mumkin:
- Sizning LCP'ngiz Shimoliy Amerikadagi foydalanuvchilar uchun a'lo, lekin Avstraliyadagi foydalanuvchilar uchun yomon, chunki sizning asosiy rasm serveringiz AQShda joylashgan.
- Sizning INP'ngiz rivojlanayotgan bozorlarda mashhur bo'lgan o'rta darajadagi Android qurilmalarida yuqori, chunki sizning JavaScript'ingiz ular uchun juda ko'p CPU talab qiladi.
- Sizning CLS'ngiz faqat CSS media so'rovi reklamaning noto'g'ri o'lchamini o'zgartirishiga sabab bo'ladigan ma'lum ekran o'lchamlarida muammo bo'ladi.
Ushbu darajadagi segmentlangan tushuncha sizga haqiqiy foydalanuvchi bazangizga, ular qayerda bo'lishidan qat'i nazar, eng katta ta'sir ko'rsatadigan optimallashtirishlarni birinchi o'ringa qo'yish imkonini beradi.
Xulosa: O'lchashdan Mahoratgacha
Veb ishlashi dunyosi yetuklashdi. Biz oddiy texnik vaqt o'lchovlaridan foydalanuvchining idrok etgan tajribasini murakkab tushunishga o'tdik. Sayohat uchta asosiy qadamni o'z ichiga oladi:
- Tajribani O'lchash: Core Web Vitals (LCP, INP, CLS) ni to'plash uchun `PerformanceObserver` dan foydalaning. Bu sizga *nima* bo'layotganini va foydalanuvchiga *qanday his qilinayotganini* aytadi.
- Sababni Tashxislash: Chuqurroq o'rganish uchun asosiy Vaqt API'laridan (Navigation, Resource, User, Long Tasks) foydalaning. Bu sizga tajribaning *nima uchun* yomon ekanligini aytadi.
- Aniq Harakat Qilish: Muayyan foydalanuvchi segmentlari uchun muammoning asl sababini bartaraf etadigan ongli, maqsadli optimallashtirishlarni amalga oshirish uchun birlashtirilgan ma'lumotlardan foydalaning.
Ham yuqori darajadagi foydalanuvchi metrikalarini, ham past darajadagi diagnostika API'larini o'zlashtirib, siz yaxlit ishlash strategiyasini qurishingiz mumkin. Siz taxmin qilishni to'xtatasiz va nafaqat texnik jihatdan tez, balki har bir foydalanuvchi uchun, har bir qurilmada, dunyoning istalgan joyida tez, sezgir va yoqimli his etiladigan veb-tajribani yaratishni boshlaysiz.