Mundarija (25)
- Bu darsda
- 1. Nega bu kerak?
- 2. WebGL: eng past qavat
- 3. Three.js va React Three Fiber
- 3.1 Three.js: sahna, kamera, renderer
- 3.2 React Three Fiber: sahna — JSX
- 3.3 drei va Spline
- 4. Narx va tezlik
- 4.1 O'lchov: bitta kub — +233 KB
- 4.2 Tezlashtirish usullari
- 4.3 Accessibility
- 5. 3D qachon arziydi
- 6. 20-qism yakuni: vazifalar v10
- 6.1 Nima qurdik
- 6.2 Narx — har qadamda
- 6.3 Sifat — v9 bilan yonma-yon
- 7. Ko'p uchraydigan xatolar
- 8. Mashqlar
- 1-mashq (oson): arziydimi?
- 2-mashq (o'rta): 233 KB qancha vaqt?
- 3-mashq (qiyin): 3D ko'rinish — faqat so'ralganda
- 4-mashq: Vazifalar qadami — v10 ni o'zingiz o'lchang
- 9. Real ishda
- Xulosa
- Manbalar
3D va WebGL React'da: Three.js, React Three Fiber va 20-qism yakuni
Qisqacha: Brauzerda 3D — WebGL (va yangi WebGPU): videokarta bilan chiziladigan
<canvas>. Uning ustida eng mashhur kutubxona — Three.js: sahna, kamera, yorug'lik, shakllar. React Three Fiber (R3F) — Three.js uchun React renderer'i:<mesh>,<boxGeometry>kabi JSX teglar bilan sahna quriladi. Narxi katta: kanon tajribasida bitta aylanuvchi kub — +233.2 KB gzip,vazifalarning butun birinchi yuklashidan ko'p. 3D mahsulot ko'rinishi, konfigurator, vizualizatsiya uchun arziydi; "chiroyli fon" uchun — yo'q. Bu dars — ko'rsatkich va 20-qismning yakuni:vazifalarv10 qayerga keldi.
Bu darsda
- WebGL, Three.js va React Three Fiber qatlamlarini farqlaysiz.
- R3F sahnasining asosiy qismlarini (
Canvas,mesh, yorug'lik,useFrame) o'qiy olasiz va drei, Spline nima ekanini bilasiz. - 3D sahnani tezlashtirish usullarini (
frameloop="demand", instancing,dpr, lazy) aytasiz. - 3D qachon arzishini raqam bilan asoslaysiz.
- 20-qism natijasini —
vazifalarv10 ning narxi va sifatini — v9 bilan solishtirasiz.
Oldin bilishingiz kerak: 3D transformlar va perspektiva, Motion IV, lazy va code splitting, requestAnimationFrame, Lottie, Rive va AutoAnimate.
1. Nega bu kerak?
«Bahor» yangi xizmat ochmoqchi: to'y va tadbirlar uchun zal ijarasi. Jasur aka saytda zalni "aylanib ko'rish" imkonini xohlaydi: stollar joylashuvi, sahna, chiroqlar. Foydalanuvchi sichqoncha bilan zalni burib ko'rsin, stollar sonini o'zgartirsin.
Bu — haqiqiy 3D. 3D transformlar bilan kartani burish mumkin, lakin xonani, yorug'lik va soyani — yo'q. Buning uchun videokartaga to'g'ridan-to'g'ri gapiradigan API kerak.
Hayotiy o'xshatish: kino. WebGL — kamera va plyonka: kuchli, lekin har kadrni o'zingiz sozlaysiz. Three.js — tayyor studiya: dekoratsiya, chiroqlar, kamera operatori. React Three Fiber — studiyani React tilida boshqaradigan rejissyor: "sahnada stol bor, ustida chiroq" deb yozasiz, qolganini u qiladi.
Bu dars ko'rsatkich (xaritada "ko'rsatkich" deb belgilangan): 3D — o'z kursi bo'lishi mumkin bo'lgan katta soha. Maqsad — xaritani ko'rish, narxni bilish va "kerakmi?" degan savolga javob bera olish.
2. WebGL: eng past qavat
WebGL — brauzerning videokarta (GPU) bilan chizish API'si. U <canvas> elementida ishlaydi. Natija oynasida uni to'g'ridan-to'g'ri sinab ko'ramiz — eng oddiy ish: butun canvas'ni bitta rangga bo'yash.
import { useEffect, useRef, useState } from "react";
const COLORS = [
[0.11, 0.31, 0.85],
[0.85, 0.47, 0.11],
];
export default function App() {
const canvas = useRef(null);
const [i, setI] = useState(0);
useEffect(() => {
const gl = canvas.current.getContext("webgl2");
if (gl === null) return; // WebGL yo'q — canvas bo'sh qoladi
const [r, g, b] = COLORS[i];
gl.clearColor(r, g, b, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
}, [i]);
return (
<div>
<canvas
ref={canvas}
width={160}
height={80}
role="img"
aria-label="Rang namunasi"
/>
<p>
<button onClick={() => setI((i + 1) % 2)}>
Rangni almashtir
</button>
</p>
</div>
);
}Ekranda:
Rangni almashtir«Ishga tushir» — ko'k to'rtburchak, bosilsa — to'q sariq. Ranglar 0…1 oralig'ida (0.11, 0.31, 0.85 — ko'k). Tekshiruvchimiz (jsdom) canvas chiza olmaydi: getContext null qaytaradi, kod return bilan chiqadi. Shuning uchun Ekranda: da faqat tugma.
Bu bitta rang edi. Uchburchak chizish uchun esa sheyder (shader — GPU'da ishlaydigan kichik dastur, alohida tilda — GLSL) yozish, buferlar yaratish, matritsalarni hisoblash kerak — yuzlab qator. Shuning uchun deyarli hech kim WebGL'ni to'g'ridan-to'g'ri yozmaydi.
WebGPU — WebGL'ning yangi avlodi: zamonaviy GPU imkoniyatlari, hisob-kitob (compute) ham. Three.js'da WebGPU renderer'i ham bor. Lekin ko'p loyihalar hali WebGL'da.
3. Three.js va React Three Fiber
3.1 Three.js: sahna, kamera, renderer
Three.js WebGL ustida "studiya" beradi:
flowchart LR
S["Scene: sahna"] --> M["Mesh: shakl + material"]
S --> L["Light: yorug'lik"]
C["Camera: kamera"] --> R["Renderer: WebGL"]
S --> R
R --> V["canvas"]Mesh = geometriya (shakl: kub, shar, yuklangan model) + material (sirt: rang, yaltiroqlik). Yorug'liksiz meshStandardMaterial qora ko'rinadi — real hayotdagidek. Renderer har kadrda sahnani kamera ko'zi bilan <canvas> ga chizadi.
3.2 React Three Fiber: sahna — JSX
R3F (@react-three/fiber) — React'ning rendereri, xuddi react-dom kabi. react-dom JSX'dan DOM elementlarini yasaydi, R3F esa Three.js obyektlarini. Kanon tajribasidagi kod (tajriba/kitlar/src/k/r3f.tsx, three 0.186.1, @react-three/fiber 9.8.1; formatlangan):
import { useRef } from "react";
import { Canvas, useFrame } from "@react-three/fiber";
import type { Mesh } from "three";
function Kub() {
const r = useRef<Mesh>(null);
useFrame((_, d) => {
if (r.current) r.current.rotation.y += d;
});
return (
<mesh ref={r}>
<boxGeometry />
<meshStandardMaterial color="green" />
</mesh>
);
}
export function Sahna() {
return (
<div style={{ height: 300 }}>
<Canvas>
<ambientLight />
<Kub />
</Canvas>
</div>
);
}O'qiymiz:
<Canvas>— sahna, kamera va WebGL renderer'ni yaratadi. U ota elementini to'ldiradi — shuning uchunheight: 300.<mesh>,<boxGeometry>,<meshStandardMaterial>— Three.js sinflari (Mesh,BoxGeometry…) kichik harf bilan. Import kerak emas — R3F ularni nomidan topadi. Props — konstruktor va xususiyatlar.useFrame((holat, delta) => …)— har kadrda chaqiriladi (requestAnimationFrameustida).delta— oldingi kadrdan beri soniyalar:rotation.y += d— sekundiga 1 radian, kompyuter tezligiga bog'liq emas.
useFrame ichida state o'zgartirmang. Ref orqali obyektni to'g'ridan-to'g'ri o'zgartirish — Motion IV dagi motion value g'oyasining o'zi: har kadrda React qayta chizmaydi.
3.3 drei va Spline
- drei (
@react-three/drei) — R3F uchun tayyor yordamchilar to'plami:OrbitControls(sichqoncha bilan aylantirish),useGLTF(Blender'dan eksport qilingan.glbmodelni yuklash),Environment(yorug'lik muhiti),Html(sahna ichida oddiy HTML). Zal misolidagi "aylanib ko'rish" — bitta<OrbitControls />. - Spline — brauzerdagi 3D dizayn vositasi (Figma'ga o'xshash). Dizayner sahnani o'zi chizadi, siz uni
iframeyoki@splinetool/react-splinekomponenti bilan qo'yasiz. Kod yozmasdan 3D — lekin runtime og'ir. Biz uni o'lchamadik.
drei va Spline kanon tajribasida o'lchanmagan. Ular bilan birinchi yuklash yanada ko'payadi.
4. Narx va tezlik
4.1 O'lchov: bitta kub — +233 KB
- Motion m.*14,2 KB
- GSAP + ScrollTrigger43,4 KB
- React Flow56,1 KB
- Konva95,4 KB
- three + R3F (bitta kub)CSP 0233,2 KB
Manba: Kanon o'lchovi: tajriba/kutubxonalar.txt va QADAMLAR (Vite 8.3.3, Chrome 155, 2026-10-14)
Bitta yashil kub vazifalar ning butun birinchi yuklashidan (201.8 KB) og'ir. Sababi — Three.js katta: matematika, yorug'lik modellari, sheyderlar to'plami. Tree shaking yordam beradi, lekin "kub + yorug'lik" uchun ham asosiy yadro kerak. CSP — 0 buzilish: Three.js <style> va eval ishlatmaydi.
Bundan tashqari model fayllari: zal modeli (.glb) bir necha MB bo'lishi mumkin — JS'dan ham og'ir. Ularni siqish (Draco, Meshopt) va teksturalarni kichraytirish — 3D loyihaning alohida ishi.
4.2 Tezlashtirish usullari
| Usul | Nima beradi |
|---|---|
lazy + poster rasm |
233 KB faqat 3D ko'rinish ochilganda (lazy) |
<Canvas frameloop="demand"> |
harakat yo'q paytda kadr chizilmaydi — batareya tejaladi |
dpr={[1, 2]} |
Retina ekranda piksel zichligini 2 bilan cheklash |
instancing (InstancedMesh) |
200 ta bir xil stul — bitta chizish buyrug'i |
useGLTF.preload, siqilgan model |
model oldindan va kichik yuklanadi |
prefers-reduced-motion |
avtomatik aylanishni o'chirish |
Standartda R3F har kadrda chizadi (frameloop="always") — sahna qimirlamasa ham, sekundiga 60 marta. Telefonda bu batareyani tez yeydi. "demand" da faqat o'zgarish bo'lganda chiziladi (OrbitControls buni o'zi bildiradi).
4.3 Accessibility
<canvas> — ekran o'quvchi uchun "qora quti": ichida nima borligini u bilmaydi. Shuning uchun:
- canvas'ga matnli muqobil bering (
role="img"vaaria-label, yuqoridagi WebGL misolidagidek) va muhim ma'lumotni canvas tashqarisida ham ko'rsating: zal sig'imi, stollar soni, narx — oddiy HTML. - Sichqoncha bilan aylantirishga klaviatura muqobili: "chapga burish" / "o'ngga burish" tugmalari (Bobur uchun).
- Avtomatik aylanish — harakatni kamaytirish yoqilgan bo'lsa, to'xtasin.
5. 3D qachon arziydi
| Arziydi | Arzimaydi |
|---|---|
| mahsulot konfiguratori (mebel, mashina, zal) | "chiroyli" fon, aylanuvchi logotip |
| ma'lumot vizualizatsiyasi (xarita, bino, molekula) | 2D bilan aytsa bo'ladigan narsa |
| o'yin, interaktiv taqdimot | ish vositasi (ro'yxat, forma, jadval) |
| foydalanuvchi aynan 3D uchun kelgan sahifa | har sahifada yuklanadigan bezak |
Savollar: 3D olib tashlansa, foydalanuvchi nimanidir yo'qotadimi? Sekin telefonda 233 KB + model + GPU yuklamasi — qabul qilinadimi? Bu sahifa alohida (lazy) yuklanadimi? Uchta "ha" bo'lsa — R3F. Aks holda — rasm, video yoki CSS 3D (3D transformlar).
vazifalar da 3D yo'q va bo'lmaydi: ish vositasi, ustunlik — tezlik. Kanon tajribasi R3F'ni faqat narxni bilish uchun o'lchadi (QADAMLAR, #27–#30).
Tekshirib ko'ring: «Bahor» bosh sahifasida aylanib turadigan 3D osh lagani bor. Bosh sahifa — eng ko'p ochiladigan sahifa. 3D'ni saqlab qolish uchun nima qilasiz?
Javob
Eng yaxshisi — 3D'ni bosh sahifadan olib tashlash: lagan videosi yoki rasm deyarli bir xil taassurot beradi, 233 KB va GPU yuklamasisiz. Saqlash shart bo'lsa: birinchi ekranda poster rasm (LCP — rasm), 3D esa lazy bilan, foydalanuvchi "3D ko'rinish" ni bosganda yoki sahifa yuklanib bo'lgach. frameloop="demand", harakat kamaytirilganda aylanish yo'q. Va o'lchang: Lighthouse va INP oldin va keyin.
6. 20-qism yakuni: vazifalar v10
6.1 Nima qurdik
20-qismda vazifalar v9 dan v10 ga o'tdi. 10 ta holat, har biri o'lchov bilan:
- Dizayn tizimi — Tailwind v4 (preflight'siz, tokenlar
@themeda),cn()(clsx) va cva bilanTugma,@/alias vacomponents.json(shadcn/ui I). - Headless komponentlar — Radix menyu (
modal={false}— CSP) va tooltip,asChildbilan o'zTugmamiz (Radix chuqur). - Ikonkalar — lucide, 9 ta,
aria-hidden(Ikonkalar). - Ctrl+K buyruqlar oynasi — cmdk, birinchi ochilishda yuklanadi (Command palette).
- Holatlar — bo'sh holat ikonkasi, kechikib chiqadigan skeleton (Yuklanish holatlari).
- Teglar jadvali — TanStack Table v9,
aria-sort(TanStack Table). - «Tartiblash» rejimi — dnd-kit, klaviatura bilan ham, rejim yoqilganda yuklanadi (dnd-kit).
- Animatsiya — CSS (dialog, menyu), Motion (yangi qator,
LazyMotion), WAAPI (o'chirish) (CSS animatsiyalari, Motion IV).
Va kanonga kirmaganlar — har biri o'lchov bilan: MUI, AntD, Mantine, Chakra, HeroUI, React Aria, Base UI, sonner, vaul, Radix Dialog, Konva, React Flow, AutoAnimate, AnimatePresence ro'yxatda, <ViewTransition>, GSAP, Lottie/Rive, R3F.
6.2 Narx — har qadamda
Birinchi yuklash JS (gzip) holatma-holat (natijalar/tekshiruv-NN.txt, "JAMI birinchi js"):
| holat | birinchi yuklash |
|---|---|
| 0 | 151,4 |
| 2 | 151,9 |
| 3 | 179,1 |
| 4 | 179,1 |
| 8 | 181,1 |
| 11 | 184,8 |
| 12 | 185 |
| 14 | 185 |
| 17 | 186,6 |
| 22 | 186,7 |
| 25 | 201,8 |
Manba: Kanon o'lchovi: natijalar/tekshiruv-00…25.txt (JAMI birinchi js, gzip -9, kB = 1000 bayt), 2026-10-14
Ikki sakrash ko'rinadi. Holat 03 — Radix menyu (+27.2 KB). Holat 25 — Motion va umumiy chunk'lar (+15.1 KB). cmdk (6.3 KB), dnd-kit (15.4 KB), jadval (14.0 KB) va animatsiya yadrosi (14.5 KB) — keyin, kerak bo'lganda. Tuzatishdan oldin birinchi yuklash 219.9 KB edi. 20-qaror 1 bo'yicha cmdk va dnd-kit kech yuklashga o'tkazildi va 201.8 KB ga tushdi.
6.3 Sifat — v9 bilan yonma-yon
| O'lchov | v9 | v10 |
|---|---|---|
| Birinchi yuklash JS / CSS (gzip) | 151.4 / 2.5 KB | 201.8 / 4.6 KB |
| Lighthouse mobil (kirgan / birinchi tashrif) | 96 / 97 | 93 / 94 |
| FCP / LCP (kirgan) | 2.0 / 2.4 s | 2.3 / 2.9 s |
| INP, 150 vazifa (mediana / eng uzun) | 16 / 32 ms | 24 / 40 ms |
Manbalar: lighthouse-tuzatish.txt (Lighthouse 13.5.0, bir sessiyada), tuzatish-inp.txt. «Tartiblash» rejimida INP — 48 / 80 ms (TEXNIK-QARZ 59). Lighthouse bitta o'lchov, ±2–3 ball shovqin. TBT 100 → 50 ms, CLS 0.
Testlar (tekshiruv-25.txt va brauzer natijalari): node:test 203/203, Vitest 65/65; lint, format:check, tip, knip — toza. Brauzer ssenariylari: 13–17-qism 159/159, 18-qism 72/72, 19-qism 100/100, 20-qism 77/77 (Ctrl+K rus tartibida tekshiruvi bilan) — hammasi dist/ da, CSP va Trusted Types ostida. axe — 8 ko'rinishda 0 buzilish.
Halol xulosa: v10 og'irroq va sal sekinroq. Har kilobayt va millisekund qayerdan kelgani ma'lum va qabul qilingan (TEXNIK-QARZ 56, 59). Evaziga — foydalanuvchi uchun yangi imkoniyatlar va a11y'ni buzmagan holda. 20-qismning asosiy saboqi shu: kutubxona bepul emas, uni o'lchab qo'shasiz.
7. Ko'p uchraydigan xatolar
| Belgi | Sabab | Davosi |
|---|---|---|
| canvas bo'sh, balandligi 0 | <Canvas> ota elementini to'ldiradi, otaning balandligi yo'q |
otaga height |
| kub qora | yorug'lik yo'q (meshStandardMaterial) |
<ambientLight /> yoki meshBasicMaterial |
| sahna sekin, telefon qiziydi | har kadrda chizish | frameloop="demand", dpr |
| har kadrda React qayta chiziladi | useFrame ichida setState |
ref orqali o'zgartirish |
| 200 ta stul — sekin | har biri alohida mesh | instancing |
| sahifa uzoq ochiladi | three + model birinchi yuklashda | lazy + poster, siqilgan model |
| ekran o'quvchi hech narsa eshitmaydi | canvas — qora quti | aria-label, ma'lumot HTML'da |
8. Mashqlar
Mashqlar kurs/mashqlar/20/30-3d/ da.
1-mashq (oson): arziydimi?
ha yoki yo'q:
- Mebel do'konida divanni har tomondan aylantirib, rangini tanlash →
- Admin paneldagi "Sozlamalar" sarlavhasi yonida aylanuvchi 3D tishli g'ildirak →
- Toshkent metro xaritasining 3D sxemasi, bekatni bosib ma'lumot olish →
Yechim
ha— 3D'ning o'zi mahsulot: foydalanuvchi uni ko'rish uchun kelgan.yo'q— bezak, ish vositasida. 233 KB evaziga hech narsa bermaydi. Lucide ikonka yetadi.ha— vizualizatsiya: joylashuvni 3D yaxshiroq tushuntiradi. Lekin bekat ma'lumoti HTML'da ham bo'lsin (ekran o'quvchi uchun).
2-mashq (o'rta): 233 KB qancha vaqt?
Funksiya yozing: downloadSeconds(kb, mbit) — kb kilobaytni (1 KB = 1 000 bayt) mbit Mbit/s tezlikda necha soniyada yuklashini qaytarsin (bir xona aniqlik bilan, satr). Keyin uchta tezlik uchun three + R3F (233.2 KB) va vazifalar ning butun birinchi yuklashini (201.8 KB) hisoblang.
Ishora: 1 bayt = 8 bit; 1 Mbit = 1 000 000 bit. toFixed(1) — Matn ↔ son.
// ... funksiyangiz
for (const mbit of [1.6, 10, 50]) {
const r3f = downloadSeconds(233.2, mbit);
const app = downloadSeconds(201.8, mbit);
console.log(`${mbit} Mbit/s: 3D ${r3f} s, ilova ${app} s`);
}Konsolda:
1.6 Mbit/s: 3D 1.2 s, ilova 1.0 s
10 Mbit/s: 3D 0.2 s, ilova 0.2 s
50 Mbit/s: 3D 0.0 s, ilova 0.0 sYechim
function downloadSeconds(kb, mbit) {
const bits = kb * 1000 * 8;
return (bits / (mbit * 1_000_000)).toFixed(1);
}
for (const mbit of [1.6, 10, 50]) {
const r3f = downloadSeconds(233.2, mbit);
const app = downloadSeconds(201.8, mbit);
console.log(`${mbit} Mbit/s: 3D ${r3f} s, ilova ${app} s`);
}Konsolda:
1.6 Mbit/s: 3D 1.2 s, ilova 1.0 s
10 Mbit/s: 3D 0.2 s, ilova 0.2 s
50 Mbit/s: 3D 0.0 s, ilova 0.0 s1.6 Mbit/s — Lighthouse'ning "sekin 4G" sozlamasidagi tezlik. Unda bitta kub 1.2 soniya — butun ilovadan ko'p. Bu faqat yuklash. Undan keyin JavaScript'ni o'qish va bajarish (arzon telefonda — yana bir necha yuz ms), model fayli va GPU ishi bor. 50 Mbit/s da yuklash sezilmaydi, lekin bajarish qoladi. Shuning uchun "tez internetda yaxshi ishlaydi" — yetarli dalil emas.
3-mashq (qiyin): 3D ko'rinish — faqat so'ralganda
Zal sahifasi: avval poster (🏛️ Zal: 120 o'rin matni), «3D ko'rinish» tugmasi. Bosilganda 3D komponent lazy bilan yuklanadi (natija oynasida — 200 ms dan keyin «3D sahna tayyor» matnini chiqaradigan soxta komponent), yuklanayotganda «3D yuklanmoqda…». WebGL bo'lmasa (supportsWebGL prop false) — tugma o'rnida «3D ko'rinish bu qurilmada mavjud emas», ma'lumot baribir ko'rinsin.
Ishora: Lottie, Rive va AutoAnimate darsidagi poster + lazy naqshi; Suspense fallback (Suspense). Haqiqiy loyihada supportsWebGL — !!document.createElement("canvas").getContext("webgl2").
Yechim
import { Suspense, lazy, useState } from "react";
function FakeScene() {
return <p>3D sahna tayyor</p>;
}
// Haqiqiy loyihada: lazy(() => import("./ZalSahnasi"))
const Scene = lazy(
() =>
new Promise((resolve) =>
setTimeout(() => resolve({ default: FakeScene }), 200),
),
);
function Hall({ supportsWebGL }) {
const [show3d, setShow3d] = useState(false);
return (
<section>
<p>🏛️ Zal: 120 o'rin</p>
{!supportsWebGL && (
<p>3D ko'rinish bu qurilmada mavjud emas</p>
)}
{supportsWebGL && !show3d && (
<button onClick={() => setShow3d(true)}>3D ko'rinish</button>
)}
{show3d && (
<Suspense fallback={<p>3D yuklanmoqda…</p>}>
<Scene />
</Suspense>
)}
</section>
);
}
export default function App() {
return <Hall supportsWebGL={true} />;
}Ekranda:
🏛️ Zal: 120 o'rin
3D sahna tayyorZal haqidagi asosiy ma'lumot (120 o'rin) doim HTML'da — 3D bo'lmasa ham, ekran o'quvchi ham uni oladi. 233 KB faqat bosilganda yuklanadi. supportsWebGL={false} qilib ko'ring — tugma o'rnida izoh chiqadi, sahifa buzilmaydi. Bu View Transitions dagi kabi progressive enhancement: imkoniyat bo'lsa — qo'shimcha, bo'lmasa — oddiy, lekin to'liq.
4-mashq: Vazifalar qadami — v10 ni o'zingiz o'lchang
Commit yo'q — 20-qism kanoni holat 25 da tugadi. vazifalar v10 da: npm run build (birinchi yuklash JS ~202 KB, CSS ~4.6 KB ekanini toping), npm test (203 va 65), brauzerda Lighthouse mobil (kirgan sahifa). Natijangizni «Sifat — v9 bilan yonma-yon» jadvali bilan solishtiring va farqni yozing.
Yechim
- Build hajmi — kanonga juda yaqin bo'ladi (bir xil versiyalar,
--save-exact). Bir necha yuz bayt farq — normal. - Lighthouse ballari kompyuteringiz va tarmoq sozlamasiga bog'liq: ±2–3 ball — shovqin. Muhimi — v9 bilan bir sessiyada, bir xil sharoitda solishtirish. Kanon ham shunday qilgan (
lighthouse-tuzatish.txt). - Farq katta bo'lsa (masalan, JS 220 KB) — cmdk yoki dnd-kit birinchi yuklashga qaytib kirgan bo'lishi mumkin.
dist/assetsdagi chunk'larnitekshiruv-25.txtbilan solishtiring.
9. Real ishda
- Elektron tijorat — 3D mahsulot ko'rinishi, "xonangizda ko'ring" (AR). Mebel, avtomobil, poyafzal do'konlari.
- Ko'chmas mulk va arxitektura — kvartira va bino turlari, virtual tur. O'zbekistondagi yangi turar-joy majmualari saytlarida tobora ko'p uchraydi.
- Ma'lumot vizualizatsiyasi va o'yinlar — R3F ekotizimi (drei,
@react-three/rapierfizika) bilan. - Intervyu savollari: "WebGL, Three.js va R3F farqi?", "3D sahnani qanday tezlashtirasiz?", "
useFrameichida negasetStateqilinmaydi?", "3D'ni sahifaga qo'shishdan oldin nimani o'lchaysiz?".
Xulosa
- WebGL/WebGPU — GPU bilan
<canvas>ga chizish; to'g'ridan-to'g'ri yozish — sheyderlar va yuzlab qator. - Three.js — sahna, kamera, yorug'lik, mesh; R3F — ularni JSX bilan (
<Canvas>,<mesh>,useFrame); drei — tayyor yordamchilar; Spline — dizayner vositasi. - Narxi: bitta kub — +233.2 KB gzip (kanon tajribasi), CSP 0; model fayllari — alohida og'irlik.
- Tezlik:
lazy+ poster,frameloop="demand",dpr, instancing; a11y: ma'lumot HTML'da, klaviatura muqobili. - 3D — mahsulot o'zi 3D bo'lsa arziydi; ish vositasida — yo'q.
- 20-qism yakuni:
vazifalarv10 — birinchi yuklash 151.4 → 201.8 KB, Lighthouse 96 → 93, INP 16 → 24 ms, testlar va axe — toza. Har kilobayt o'lchangan va asoslangan.
Keyingi dars: Kalendar va bron qilish UI — 21-qism boshlanadi: media, integratsiyalar va PWA. Qism davomida «Bahor»ga bron kalendari, xaritalar, to'lov va Telegram Mini App qo'shamiz. Oxirida vazifalar PWA va offline-first ilovaga aylanadi — service worker'ni Workbox bilan qayta quramiz.
Manbalar
- Three.js — threejs.org/docs (0.186.1); React Three Fiber — r3f.docs.pmnd.rs (9.8.1): Canvas, useFrame, performance (frameloop, instancing, dpr)
- drei — github.com/pmndrs/drei; Spline — spline.design
- MDN: WebGL API, WebGPU API — developer.mozilla.org/docs/Web/API/WebGL_API
- IlmHamroh kurs tajribasi:
vazifalarv10 yakuniy o'lchovlari (hajm, Lighthouse, INP, kutubxonalar hajmi)
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!