Mundarija (31)
- Bu darsda
- 1. Nega bu kerak?
- 2. Ulashning uch usuli
- 2.1 Jonli taqqoslash
- 2.2 Qaysi biri qachon
- 2.3 viewBox va currentColor — ikonkaning ikki sharti
- 2.4 Ikonka shriftlari — eski usul
- 2.5 Kirish imkoniyati
- 3. SVGO: kichraytirish
- 3.1 Dizayn dasturining izlari
- 3.2 SVGO ishga tushiramiz
- 3.3 Allaqachon toza fayllar
- 3.4 Xavfli optimallashtirishlar
- 4. Sprite: o'z skriptimiz
- 4.1 Sprite nima
- 4.2 sprite.mjs
- 4.3 Sprite va CSP, boshqa domen
- 5. Vite'da SVG import variantlari
- 6. vazifalar dagi ikonka
- 7. Ko'p uchraydigan xatolar
- 7.1 viewBox yo'q
- 7.2 Rang qotirilgan
- 7.3 <use> boshqa domendan
- 7.4 SVG'ni foydalanuvchidan qabul qilish
- 8. Mashqlar
- 1-mashq (oson): Qaysi usul?
- 2-mashq (o'rta): SVGO va currentColor
- 3-mashq (qiyin): Sprite skripti
- 9. Real ishda
- Xulosa
- Manbalar
SVG va ikonka pipeline
Qisqacha: SVG ikonkani uch yo'l bilan ulash mumkin:
<img src>(oddiy, lekin CSS rangini o'zgartirib bo'lmaydi), inline<svg>(rangcurrentColorbilan matn rangidan olinadi) va sprite — bitta fayldagi ko'p<symbol>va<use href="ikonlar.svg#osh">. Dizayn dasturlaridan chiqqan SVG ortiqcha ma'lumotga to'la — SVGO uni xavfsiz kichraytiradi (bizning misolda −72 %). Vite'da?rawSVG matnini beradi, React'da esavite-plugin-svgruni komponentga aylantiradi.
Bu darsda
- SVG'ni
<img>, inline va sprite usulida ulaysiz va har birining narxini bilasiz. viewBoxvacurrentColorikonka uchun nega muhimligini tushuntira olasiz.- SVGO bilan SVG'ni kichraytirasiz va natijasini o'qiysiz.
- O'z sprite yasovchi skriptingizni yozasiz.
- Vite'da SVG import variantlarini va
vite-plugin-svgrni taniysiz.
Oldin bilishingiz kerak: SVG HTML ichida va ikonkalar, SVG'ni CSS bilan stillash va ikonka tizimi, Vite IV: assetlar va maxsus importlar.
1. Nega bu kerak?
Jasur aka menyuga har taom yoniga kichik ikonka qo'ymoqchi: osh, choy, manti. Dizayner Figma'dan (yoki Inkscape'dan) SVG fayllarni yubordi. Sardor ularni <img> bilan qo'ydi. Uch muammo chiqdi:
- Qorong'i mavzuda ikonkalar ko'rinmay qoldi — ular yashil chiziqli, fon ham to'q. CSS bilan rangini o'zgartirib bo'lmadi.
- Har ikonka — alohida HTTP so'rov. Menyuda 20 ta taom — 20 ta so'rov.
- Bir fayl 1.2 KB, ichidagi rasm esa ikkita chiziq. Qolgani — dizayn dasturining "izlari".
SVG'ni (SVG HTML ichida va ikonka tizimi darslarida) HTML va CSS tomonidan bilasiz. Bu dars — pipeline (quvur): dizaynerdan kelgan fayl brauzerga qanday yo'l bilan, qanday tozalanib yetib boradi. Sxema:
flowchart LR
A["Figma / Inkscape<br/>eksport"] --> B["SVGO<br/>tozalash"]
B --> C["rang →<br/>currentColor"]
C --> D{"qanday<br/>ulash?"}
D --> E["img"]
D --> F["inline svg"]
D --> G["sprite + use"]Chapdan o'ngga: avval tozalaymiz, keyin rangni "moslashuvchan" qilamiz, oxirida ulash usulini tanlaymiz.
2. Ulashning uch usuli
2.1 Jonli taqqoslash
Quyidagi natijada bitta "osh" ikonkasi uch xil ulangan. Birinchi ikkitasi — sprite'dagi <symbol> va <use>, rangi ota elementning color xususiyatidan. Uchinchisi — <img>.
<style>
.qator { display: flex; gap: 1.5rem; font: 15px system-ui; }
.qator span { display: grid; justify-items: center; gap: 4px; }
.ikon { width: 48px; height: 48px; }
.yashil { color: #1f6f4a; }
.qizil { color: #b3261e; }
</style>
<svg width="0" height="0" style="position: absolute"
aria-hidden="true">
<symbol id="osh" viewBox="0 0 24 24">
<path d="M3 14c0 4.4 4 8 9 8s9-3.6 9-8Z" fill="none"
stroke="currentColor" stroke-width="2"/>
<path d="M8 10c0-2 2-2 2-4m3 4c0-2 2-2 2-4" fill="none"
stroke="currentColor" stroke-width="2"/>
</symbol>
</svg>
<div class="qator">
<span class="yashil">
<svg class="ikon" aria-hidden="true"><use href="#osh"/></svg>
yashil
</span>
<span class="qizil">
<svg class="ikon" aria-hidden="true"><use href="#osh"/></svg>
qizil
</span>
<span class="qizil">
<img class="ikon" alt=""
src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3E%3Cpath%20d='M3%2014c0%204.4%204%208%209%208s9-3.6%209-8Z'%20fill='none'%20stroke='currentColor'%20stroke-width='2'/%3E%3C/svg%3E">
img
</span>
</div>Qarang: birinchi ikki ikonka — bitta <symbol>, lekin turli rang. Uchinchisi ham currentColor bilan yozilgan, lekin qora: <img> ichidagi SVG — alohida hujjat, u sahifaning CSS'ini va color ini ko'rmaydi. "Tahrirlab ko'rish" bilan .qizil rangini o'zgartiring — birinchi ikki usul darhol kuzatadi.
2.2 Qaysi biri qachon
| Usul | Afzalligi | Kamchiligi |
|---|---|---|
<img src="osh.svg"> |
oddiy, alohida keshlanadi | CSS rangi ishlamaydi, har biri — so'rov |
inline <svg>…</svg> |
to'liq CSS boshqaruvi, so'rovsiz | HTML/JS'ni og'irlashtiradi, keshlanmaydi |
sprite + <use> |
bitta fayl, CSS rangi, keshlanadi | sprite'ni yasash kerak |
CSS background-image |
bezak uchun qulay | rang va kirish imkoniyati yo'q |
Qoida: logotip va katta rasm — <img>. Interfeysdagi ko'p kichik ikonka — sprite. Bitta-ikkita, animatsiyali yoki murakkab boshqariladigan — inline.
2.3 viewBox va currentColor — ikonkaning ikki sharti
viewBox="0 0 24 24" — SVG ichidagi koordinatalar tizimi: "chizma 24×24 birlikda". U bo'lsa, ikonka istalgan o'lchamga (width: 48px) chiroyli cho'ziladi. width/height atributlari bo'lsa-yu viewBox bo'lmasa — ikonka o'lchamini o'zgartirganda kesiladi yoki kichik qoladi. Sprite skriptimiz viewBox siz faylni rad etadi (pastda).
currentColor — "ota elementdagi color qiymati". Ikonka faylida stroke="#1f6f4a" emas, stroke="currentColor" bo'lsa, rangni CSS boshqaradi: tugma ustiga kelganda (:hover), qorong'i mavzuda, xato holatida. Bu — Sardorning birinchi muammosining yechimi.
2.4 Ikonka shriftlari — eski usul
Eski loyihalarda (2012–2018) ikonkalar ko'pincha shrift sifatida ulangan: Font Awesome, Glyphicons. Har ikonka — shriftdagi bitta "harf", HTML'da <i class="fa fa-coffee"></i>. Rangi color dan, o'lchami font-size dan — qulay tuyulgan. Muammolari:
- Butun shrift yuklanadi: 5 ta ikonka uchun 600 ta ikonkali fayl.
- Shrift yuklanmasa (sekin internet, bloklovchi) — o'rnida kvadrat yoki boshqa harf.
- Ekran o'quvchi "harf"ni o'qib yuborishi mumkin; chiziqlar matn kabi silliqlanadi va xira chiqadi.
SVG sprite xuddi shu qulayliklarni (currentColor, bitta fayl) beradi, lekin bu muammolarsiz. Eski loyihada fa- klasslarini ko'rsangiz — bu o'sha davr; yangi kodda SVG ishlating.
Tekshirib ko'ring: Sprite'dagi
<symbol>sahifada nega o'z-o'zidan ko'rinmaydi, lekin<use>uni chizadi?
Javob
<symbol> — "shablon": SVG spetsifikatsiyasi bo'yicha u to'g'ridan-to'g'ri chizilmaydi, faqat <use> orqali nusxa olinganda. Xuddi muhr kabi: muhr qutida turadi, qog'ozga bosilgandagina iz qoldiradi. Shu sababli bitta <symbol> sahifada 20 marta, har safar boshqa rang va o'lchamda ishlatilishi mumkin. Sahifa ichidagi sprite'ni (<svg width="0" height="0">) ham yashiramiz — u joy egallamasin.
2.5 Kirish imkoniyati
- Bezak ikonka (yonida matn bor: " Osh") —
aria-hidden="true": ekran o'quvchi (Malika ishlatadigan NVDA) uni o'qimaydi. - Ma'noli ikonka (faqat ikonka, matnsiz tugma) — tugmaga
aria-label="Savatga qo'shish", ikonkaga esaaria-hidden. <img>—altmajburiy: bezak bo'lsaalt="".
Tekshirib ko'ring: Qorong'i mavzu uchun ikonkalarni oq qilish kerak.
<img src="osh.svg">bilan buni qanday qilasiz?
Javob
To'g'ridan-to'g'ri — hech qanday: <img> ichidagi SVG sahifa CSS'ini ko'rmaydi. Variantlar: ikkinchi, oq fayl (osh-oq.svg) va <picture> + prefers-color-scheme; yoki CSS filter: invert(1) (qo'pol, rangni aniq boshqarib bo'lmaydi). Eng to'g'ri yo'l — usulni almashtirish: sprite + <use> va currentColor, keyin bitta CSS qatori: .qorongi { color: white; }.
3. SVGO: kichraytirish
3.1 Dizayn dasturining izlari
Dizayn dasturlari SVG'ga o'zlari uchun ma'lumot yozadi: tahrirlovchi nomi, qatlamlar, masshtab, yashirin elementlar. Mana Inkscape uslubidagi eksport (namuna uchun biz yozdik — haqiqiy eksportlar shunday ko'rinadi), 1.2 KB:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="24"
height="24"
viewBox="0 0 24 24"
version="1.1"
id="svg1"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
inkscape:zoom="22.627417" />
…Brauzerga sodipodi:namedview, inkscape:zoom, izoh, version, id lar kerak emas. Koordinatalar esa 3.0000000,14.000000 — keraksiz nollar bilan.
3.2 SVGO ishga tushiramiz
SVGO (SVG Optimizer, 2026-10 holatiga 4.1.0) — SVG'ni ko'rinishini o'zgartirmasdan kichraytiradigan Node vositasi:
npm i -D -E svgo@4.1.0
npx svgo osh-eksport.svg -o osh.svgChiqishda oxirgi qatorga qarang: "oldingi hajm − tejalgan foiz = yangi hajm".
osh-eksport.svg:
Done in 47 ms!
1.208 KiB - 72.3% = 0.335 KiBFayl 1.2 KiB dan 0.3 KiB ga tushdi — deyarli to'rtdan biri qoldi. Natija — bitta qator (o'qish uchun biz bo'ldik):
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"
viewBox="0 0 24 24"><path d="M3 14c0 4.418 4.03 8 9 8s9-3.582 9-8Z"
style="fill:none;stroke:#1f6f4a;stroke-width:2;stroke-linecap:round;
stroke-linejoin:round"/><path d="M8 10c0-2 2-2 2-4m3 4c0-2 2-2 2-4"
style="fill:none;stroke:#1f6f4a;stroke-width:2;
stroke-linecap:round"/></svg>Nima o'zgardi: izoh, <?xml …?>, Inkscape nomlar fazosi, namedview, bo'sh <defs>, guruh (<g>), id lar — o'chdi. M 3.0000000,14.000000 C … → M3 14c…: koordinatalar qisqardi va nisbiy buyruqlarga (c — kichik harf) o'tdi. viewBox — saqlandi (SVGO 4 sukut bo'yicha uni olib tashlamaydi).
3.3 Allaqachon toza fayllar
Hamma SVG ham bunday "semiz" emas. Sinab ko'rdik:
| Fayl | Oldin | SVGO'dan keyin |
|---|---|---|
vazifalar dagi ikon.svg |
0.269 KiB | 0.241 KiB (−10.2 %) |
Vite shablonining vite.svg |
8.505 KiB | 8.387 KiB (−1.4 %) |
Vite shablonining favicon.svg |
9.299 KiB | 9.299 KiB (0 %) |
Inkscape uslubidagi osh-eksport.svg |
1.208 KiB | 0.335 KiB (−72.3 %) |
vazifalar ikonkasini biz qo'lda yozganmiz — u allaqachon ixcham. Vite shablonining fayllari ham oldindan optimallashtirilgan. Saboq: SVGO eng ko'p dizayn dasturidan to'g'ridan-to'g'ri kelgan fayllarga yordam beradi. Shuning uchun uni pipeline'ga — fayl loyihaga kirgan joyga qo'yamiz, bir martalik qo'l ishi qilib emas.
3.4 Xavfli optimallashtirishlar
SVGO ba'zan ko'rinishga ta'sir qiladi: id larni o'chirsa, CSS yoki <use href="#…"> ularni topmaydi; juda kam aniqlik (--precision) egri chiziqlarni buzadi. Sozlama fayli svgo.config.mjs da plaginlarni o'chirish mumkin. Qoida: optimallashtirgandan keyin ikonkani ko'z bilan tekshiring.
Tekshirib ko'ring: SVGO ikonkadan
id="osh-chizigi"ni o'chirib yubordi. Qachon bu muammo?
Javob
Agar CSS (#osh-chizigi { … }), JavaScript (getElementById) yoki boshqa SVG elementi (<use href="#osh-chizigi">, gradient havolasi url(#…)) shu id ga tayansa. Oddiy ikonkada id lar dizayn dasturining qoldig'i — o'chirilgani yaxshi. Sprite'da esa id — <symbol> ning nomi; uni sprite skripti fayl nomidan o'zi qo'yadi, shuning uchun SVGO'ning o'chirgani zarar qilmaydi.
4. Sprite: o'z skriptimiz
4.1 Sprite nima
Sprite — ko'p ikonka bitta faylda. SVG'da har ikonka — <symbol id="…" viewBox="…">, o'zi ko'rinmaydi. Ishlatish — <use href="ikonlar.svg#osh">: "ikonlar.svg faylidagi osh belgisini shu yerga chiz". Brauzer faylni bir marta yuklaydi va keshlaydi.
Vite shablonining o'zida ham sprite bor — public/icons.svg (5 KB, ichida <symbol id="github-icon">, discord-icon va boshqalar), main.ts da <use href="/icons.svg#documentation-icon">.
4.2 sprite.mjs
ikonlar/ papkadagi har SVG'dan <symbol> yasab, public/ikonlar.svg ga yozadigan skript:
// sprite.mjs — ikonlar/*.svg → public/ikonlar.svg (<symbol> lar)
import { mkdirSync, readdirSync, readFileSync } from "node:fs";
import { writeFileSync } from "node:fs";
function toSymbol(name) {
const svg = readFileSync(`ikonlar/${name}`, "utf8");
const viewBox = svg.match(/viewBox="([^"]+)"/)?.[1];
const body = svg.match(/<svg[^>]*>([\s\S]*)<\/svg>/)?.[1];
if (!viewBox || body === undefined) {
throw new Error(`${name}: viewBox yoki <svg> topilmadi`);
}
const id = name.replace(".svg", "");
const open = `<symbol id="${id}" viewBox="${viewBox}">`;
return open + body.trim() + "</symbol>";
}
const symbols = readdirSync("ikonlar")
.filter((name) => name.endsWith(".svg"))
.toSorted()
.map(toSymbol);
const svgNs = "http://www.w3.org/2000/svg";
const lines = [`<svg xmlns="${svgNs}">`, ...symbols, "</svg>"];
mkdirSync("public", { recursive: true });
writeFileSync("public/ikonlar.svg", lines.join("\n") + "\n");
console.log(`public/ikonlar.svg: ${symbols.length} ta ikon`);match(/viewBox="([^"]+)"/)?.[1]— RegExp guruhi: qo'shtirnoq ichidagi qiymat.?.— topilmasaundefined(xato emas).<svg[^>]*>([\s\S]*)<\/svg>— ochuvchi tegdan yopuvchigacha hamma narsa ([\s\S]— yangi qatorlar ham).viewBoxyo'q bo'lsa — xato: ikonka sprite'da noto'g'ri cho'zilardi..toSorted()— natija har kompyuterda bir xil tartibda (git diff toza).
ikonlar/ da osh.svg (SVGO'dan keyin, rang currentColor ga almashtirilgan) va choy.svg:
node sprite.mjspublic/ikonlar.svg: 2 ta ikonHTML'da: <svg class="ikon" aria-hidden="true"><use href="/ikonlar.svg#osh" /></svg>. Vite build'da public/ikonlar.svg dist/ ga o'zgarishsiz ko'chdi, <use href> ham o'zgarmadi (Vite IV dagi public/ qoidasi). Sayt pastki papkada bo'lsa (base: "./"), href ni nisbiy yozing: ikonlar.svg#osh.
Bunday skriptni package.json ga qo'shish mumkin ("ikonlar": "svgo -f ikonlar && node sprite.mjs") yoki Vite plaginiga aylantirish — build boshida (buildStart) yasaydi.
4.3 Sprite va CSP, boshqa domen
<use href="https://cdn.example.com/ikonlar.svg#osh"> — ishlamaydi: brauzerlar <use> uchun boshqa origin'dan faylni yuklamaydi. Sprite sayt bilan bir domenda bo'lsin. vazifalar dagi CSP (img-src 'self') bilan ham mos: o'z faylimiz.
5. Vite'da SVG import variantlari
Vite IV da SVG importining asosiy shakllarini ko'rdik. Ikonka nuqtai nazaridan:
| Import | Natija | Ikonka uchun |
|---|---|---|
import url from "./osh.svg" |
manzil yoki data: (4 KB gacha) |
<img src> uchun |
import svg from "./osh.svg?raw" |
SVG matni (satr) | inline qo'yish uchun |
import Osh from "./osh.svg?react" |
React komponenti (svgr bilan) | React loyihada |
?raw + inline. Sinadik: import oshSvg from "./osh.svg?raw" va box.innerHTML = oshSvg. Build ichida SVG matni satr bo'lib qoldi (stroke:currentColor bilan). innerHTML bu yerda xavfsiz: matn — o'z faylimiz, foydalanuvchidan emas (XSS va DOM xavfsizligi). Trusted Types yoqilgan sahifada (vazifalar kabi) esa innerHTML siyosatsiz ishlamaydi — u yerda sprite qulayroq.
vite-plugin-svgr (5.2.0) — ?react importini React komponentiga aylantiradi: <Osh className="ikon" />. Ichida SVGR (@svgr/core 8.1). React — 17-qismda; hozir faqat ulanishini biling:
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import svgr from "vite-plugin-svgr";
export default defineConfig({
plugins: [react(), svgr()],
});Bu config'ni 17-qismda ishlatamiz. Muqobil yondashuv — ikonka kutubxonalari (Lucide, Heroicons): ular har ikonkani tayyor komponent sifatida beradi va tree shaking bilan faqat ishlatilganlari bundle'ga tushadi.
6. vazifalar dagi ikonka
vazifalar ning ikonkasi — public/assets/ikonlar/ikon.svg, 275 bayt, qo'lda yozilgan:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
<rect width="32" height="32" rx="7" fill="#1f6f4a"/>
<path d="M9.3 16.6 13.9 21.2 22.7 11.4" fill="none" stroke="#fff"
stroke-width="3.2" stroke-linecap="round"
stroke-linejoin="round"/>
</svg>Uning pipeline'i:
- Favicon —
index.htmlda<link rel="icon" href="assets/ikonlar/ikon.svg" type="image/svg+xml">(Favicon va web manifest). SVG favicon har o'lchamda tiniq. - PNG'lar — iOS va manifest uchun (
ikon-180.png,ikon-192.png,ikon-512.png, maskable) —npm run ikonlar(skriptlar/ikonlar.js) yasaydi: tashqi paketsiz, piksellarni o'zi chizib, PNG'ninode:zlibbilan siqadi. public/da — chunki manifest ichidagi yo'llarni Vite qayta yozmaydi (Vite IV dagi saboq).
SVGO uni 0.241 KiB ga tushirardi (−10 %), lekin fayl allaqachon kichik va o'qiladigan — vazifalar da kod o'zgarmaydi. Bu darsda kanon loyiha o'zgarmaydi.
7. Ko'p uchraydigan xatolar
7.1 viewBox yo'q
Ikonka width="24" height="24" bilan, viewBox siz. CSS'da width: 48px — rasm o'sha 24 birlikda, burchakda kichik qoladi. Yechim — viewBox="0 0 24 24" qo'shish.
7.2 Rang qotirilgan
fill="#1f6f4a" — currentColor emas. <use> bilan ham rang o'zgarmaydi: ichki atribut CSS'dan kuchli. Sprite'ga qo'shishdan oldin rangni almashtiring.
7.3 <use> boshqa domendan
Ko'rinmaydi, konsolda ham ko'pincha xato yo'q. Sprite — o'z domeningizda.
7.4 SVG'ni foydalanuvchidan qabul qilish
SVG — XML, ichida <script> bo'lishi mumkin. Foydalanuvchi yuklagan SVG'ni inline qo'yish — XSS. Foydalanuvchi SVG'si faqat <img> orqali (u yerda skript ishlamaydi) yoki serverda tozalab (Fayl yuklash xavfsizligi — backend qismida).
8. Mashqlar
Mashqlar kurs/mashqlar/16/35-svg/ da.
1-mashq (oson): Qaysi usul?
- Sayt logotipi, sahifa boshida, bir marta —
- Menyudagi 20 ta taom ikonkasi, qorong'i mavzuda rang o'zgaradi —
- Bitta animatsiyali ikonka (chiziq chiziladi) —
Yechim
<img>— oddiy, keshlanadi, rang o'zgarishi kerak emas.- Sprite +
<use>— bitta fayl,currentColorbilan mavzu rangi. - Inline
<svg>— animatsiya uchun har<path>ga CSS bilan kirish kerak (chizilish animatsiyasi).
2-mashq (o'rta): SVGO va currentColor
Darsdagi osh-eksport.svg ni yarating (yoki o'z dizayn dasturingizdan eksport qiling). npx svgo bilan kichraytiring va natija foizini yozing. Keyin rangni (#1f6f4a) currentColor ga almashtiring va natijani sahifada color: red ota element ichida inline qo'yib tekshiring.
Yechim
osh-eksport.svg:
Done in 69 ms!
1.208 KiB - 72.3% = 0.335 KiBRangni almashtirish — matn muharririda yoki bir buyruq bilan: sed -i 's/#1f6f4a/currentColor/g' osh.svg. Ota elementga style="color: red" — ikonka qizil. Vaqt (69 ms) sizda boshqacha, foiz esa bir xil chiqishi kerak: SVGO natijasi kirishga qarab aniq.
3-mashq (qiyin): Sprite skripti
ikonlar/ papkasiga ikki ikonka qo'ying (osh.svg, choy.svg, ikkalasida viewBox va currentColor). Darsdagi sprite.mjs ni yozing va ishga tushiring. Keyin uchinchi, viewBox siz fayl qo'shing — skript nima deydi?
Yechim
Ikki fayl bilan:
public/ikonlar.svg: 2 ta ikonpublic/ikonlar.svg ichida — <symbol id="choy" viewBox="0 0 24 24">…</symbol> va <symbol id="osh" …> (alifbo tartibida). viewBox siz fayl bilan skript to'xtaydi: Error: manti.svg: viewBox yoki <svg> topilmadi. Bu ataylab: noto'g'ri ikonka sprite'ga tushib, saytda jim buzilgandan ko'ra, darhol xato yaxshi.
9. Real ishda
- Dizayn tizimlari (kompaniyaning ikonka to'plami) odatda sprite yoki komponentlar paketi sifatida tarqatiladi; pipeline — Figma → eksport → SVGO → sprite/komponent → npm paket.
- React loyihalarda —
vite-plugin-svgryoki ikonka kutubxonasi (Lucide, Heroicons). - Kod tekshiruvida (code review) SVG fayllarga ham qaraladi: yangi ikonka SVGO'dan o'tganmi, rangi
currentColormi,viewBoxbormi, bezak ikonkadaaria-hiddenbormi. Bu kichik narsalar yuzlab ikonkali loyihada sezilarli hajm va kirish imkoniyati farqini beradi. - Performans byudjeti — ba'zi jamoalar CI'da "ikonka fayli 2 KB dan oshmasin" kabi chegara qo'yadi: dizayn dasturidan to'g'ridan-to'g'ri tushgan "semiz" SVG darhol ushlanadi.
- Intervyu savollari: "Ikonkalar uchun
<img>mi, inline mi, sprite mi?", "currentColornima?", "SVG'ni optimallashtirish qanday qilinadi?".
Xulosa
<img>— oddiy, lekin CSS rangi yo'q; inline — to'liq boshqaruv, keshlanmaydi; sprite +<use>— bitta fayl va CSS rangi.- Ikonka sharti:
viewBox(o'lchamga moslashish) vacurrentColor(rang CSS'dan). - SVGO dizayn eksportini sezilarli kichraytiradi (bizda −72 %), toza fayllarga deyarli ta'sir qilmaydi;
idva aniqlikka ehtiyot bo'ling. - Sprite'ni skript yasaydi (
<symbol>lar), upublic/da va o'z domeningizda turadi. - Vite:
?raw— inline uchun matn; React'davite-plugin-svgr—?reactkomponent.
Keyingi dars: Prettier konfiguratsiyasi: .prettierrc, plaginlar va --check — kod sifati asboblari bloki: formatlash qoidalari va ularni loyihada sozlash.
Manbalar
- SVGO — github.com/svg/svgo (4.1.0)
- MDN:
<use>,<symbol>,viewBox,currentColor— developer.mozilla.org - vite-plugin-svgr — github.com/pd4d10/vite-plugin-svgr (5.2.0)
- Vite hujjatlari: "Static Asset Handling" (
?raw) — vite.dev/guide/assets
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!