Mundarija (26)
- Bu darsda
- 1. Nega bu kerak?
- 2. Tree shaking qanday ishlaydi
- 2.1 Graf bo'yicha "tirik" belgilash
- 2.2 Shart: statik ESM
- 2.3 Tajriba: lodash to'rt xil
- 3. Yon ta'sir: nega bundler ehtiyot
- 3.1 Muammo
- 3.2 "sideEffects": false
- 3.3 /*#__PURE__*/
- 4. Ikki tuzoq: barrel va import *
- 4.1 Barrel fayl
- 4.2 import *
- 5. Minifikatsiya va mangling
- 5.1 Nima o'zgaradi
- 5.2 Uch minifikator
- 5.3 vazifalar da tree shaking qancha berdi?
- 6. Ko'p uchraydigan xatolar
- 7. Mashqlar
- 1-mashq (oson): Qoladimi?
- 2-mashq (o'rta): Paket formatini tekshiring
- 3-mashq (qiyin): O'lchov skripti
- 4-mashq: Amaliy tajriba — vazifalar da o'lchov
- 8. Real ishda
- Xulosa
- Manbalar
Tree shaking va minifikatsiya: o'lik kodni olib tashlash, sideEffects va /#PURE/
Qisqacha: Tree shaking — bundler ishlatilmagan eksportlarni build'dan tashlab yuborishi. U faqat ESM bilan yaxshi ishlaydi:
import/exportstatik, CommonJS'da esa bundler nima ishlatilishini bilmaydi. Ikki yordamchi signal bor: paketdagi"sideEffects": false("modullarim yon ta'sirsiz") va kod ichidagi/*#__PURE__*/("bu chaqiruv yon ta'sirsiz"). Minifikatsiya esa qolgan kodni siqadi: bo'sh joylar va izohlar o'chadi, ichki nomlar bir harfga qisqaradi (mangling).vazifalarda hajmni asosan minifikatsiya kamaytiradi (−49 %), tree shaking esa kutubxonalarda hal qiluvchi.
Bu darsda
- Tree shaking qanday ishlashini va nega CommonJS'da ishlamasligini o'lchovlar bilan ko'rsatasiz.
lodashni to'rt xil import qilib, hajm 0.17 KB dan 26 KB gacha o'zgarishini ko'rasiz.sideEffectsva/*#__PURE__*/nima qilishini va qachon xavfli ekanini bilasiz.- Barrel fayl va
import *tuzoqlarini tanisiz. - Minifikatsiya va mangling'ni, Oxc, terser va esbuild farqini o'lchaysiz.
Oldin bilishingiz kerak: Modul semantikasi, Modul formatlari, Bundler nima, Transpilyatsiya.
1. Nega bu kerak?
Bundler nima darsida price.js dagi formatDollar funksiyasi build'da g'oyib bo'lganini ko'rdik — hech kim uni import qilmagan edi. Shu g'oyani esa Modul semantikasi darsida nazariy o'rgangan edik: ESM statik, shuning uchun "nima ishlatilmaydi" ni oldindan bilish mumkin.
Bugun bu g'oya pulga aylanadi. 15-qismda Zod'ni (vazifalar ga tekshiruv kutubxonasi) bundlersiz o'lchagan edik: 233.7 KB gzip — sahifaning qolgan hammasidan bir necha baravar katta. O'shanda "bundler bilan qayta ko'ramiz" degan edik (Zod darsi). Bundler bilan Zod +23.7 KB bo'ldi — 10 baravar kam. Farqning katta qismi — tree shaking.
Hayotiy o'xshatish: safarga chamadon yig'yapsiz. Uydagi hamma narsani olmaysiz — faqat kerakligini. Tree shaking — "nima kerak?" ro'yxati, minifikatsiya — kiyimlarni ixcham taxlab, vakuum paketga solish.
Maslahat: O'lchovlar 2026-10-10 da Node 24.21.0, Vite 8.3.3 (Rolldown 1.2.12, Oxc minifikatori), lodash va lodash-es 4.18.1 bilan.
vazifalaro'lchovlari —build.targetqo'shilgan holat (#22).
2. Tree shaking qanday ishlaydi
2.1 Graf bo'yicha "tirik" belgilash
Bundler entry'dan boshlab har ishlatilgan nomni "tirik" deb belgilaydi va undan keladigan importlarni kuzatadi. Belgilanmagan hamma narsa — o'lik kod (dead code), u chiqishga yozilmaydi.
flowchart LR
M["main.js"] -->|"sum"| L["lodash-es"]
L --> S["sum ✅"]
L -.- C["chunk ❌"]
L -.- D["debounce ❌"]
L -.- X["… yana 600+ ❌"]
S --> B["baseSum ✅"]Nomi "daraxtni silkitish"dan: daraxtni silkitsangiz, quruq barglar tushadi, tiriklari qoladi. Uzluksiz o'qlar — ishlatilgan yo'l, uzuq chiziqlar — tashlab yuborilgan eksportlar.
2.2 Shart: statik ESM
Bu faqat bundler kodni bajarmasdan ko'ra olsa ishlaydi. ESM'da import { sum } from "lodash-es" — aniq: faqat sum. CommonJS'da esa require("lodash") butun module.exports obyektini qaytaradi va undan qaysi xususiyat olinishini bundler odatda bilolmaydi (Modul formatlari darsida ko'rdik: module.exports ga istalgan paytda istalgan narsa yozilishi mumkin).
2.3 Tajriba: lodash to'rt xil
lodash — mashhur yordamchi funksiyalar to'plami, CommonJS'da. lodash-es — xuddi shu kod, ESM'da. Faqat sum ni (yig'indini hisoblash) to'rt xil import qilib, Vite bilan yig'dik:
| Import | Hajm | gzip |
|---|---|---|
import _ from "lodash" → _.sum(…) |
71 739 B | 26 029 B |
import { sum } from "lodash" |
71 230 B | 25 806 B |
import sum from "lodash/sum.js" |
893 B | 499 B |
import { sum } from "lodash-es" |
211 B | 169 B |
- lodash (default)26 KB
- lodash { sum }25,8 KB
- lodash/sum.js0,5 KB
- lodash-es { sum }0,17 KB
Manba: O'lchandi: Vite 8.3.3 build, lodash/lodash-es 4.18.1, gzip, Node 24.21.0, 2026-10-10
Ikkinchi qatorga qarang: { sum } deb nomli import qildik — baribir 71 KB. Sintaksis ESM, lekin paket CommonJS: bundler butun lodash.js faylini olib kirishga majbur. lodash/sum.js — bitta faylni to'g'ridan-to'g'ri olish, CommonJS bo'lsa ham kichik (893 B, ichida yordamchi modullar). lodash-es — 340 baravar kichik.
Tekshirib ko'ring: Sardor kodda
import { sum } from "lodash"yozdi va "nomli import — demak tree shaking ishlaydi" dedi. Nega 71 KB chiqdi?
Javob
Tree shaking import qatoriga emas, paketning formatiga bog'liq. lodash ning fayli CommonJS (module.exports = lodash): bundler uning ichidan sum ni "kesib" ololmaydi, chunki 600 dan ortiq funksiya bitta obyektga runtime'da yoziladi. ESM paket (lodash-es) yoki alohida fayl (lodash/sum.js) kerak. Tekshirish: npm view lodash type module exports — module maydoni ham, "type": "module" ham yo'q.
3. Yon ta'sir: nega bundler ehtiyot
3.1 Muammo
Ba'zan modulning o'zi — yuklangan paytda — nimadir qiladi: global o'zgaruvchiga yozadi, document ga element qo'shadi, polyfill o'rnatadi. Bu yon ta'sir (side effect). Undan hech narsa import qilinmasa ham, uni o'chirish xulqni o'zgartiradi.
Kichik bahor-ui paketi — barrel fayl bilan. Barrel — boshqa modullarni qayta eksport qiladigan "yig'uvchi" index.js:
// index.js — "barrel" fayl: hamma narsa bitta eshikdan
export * from "./button.js";
export * from "./chart.js";chart.js — og'ir modul, yuklanganda o'zini ro'yxatga yozadi:
// chart.js — og'ir modul; yuklanganda o'zini ro'yxatga yozadi
const COLORS = Array.from(
{ length: 200 },
(_, i) => `hsl(${i} 60% 50%)`,
);
globalThis.chartTypes = ["ustun", "chiziq"]; // yon ta'sir!
export function drawChart(data) {
return data.map((value, i) => `${COLORS[i]}:${value}`).join(";");
}Ilova faqat tugmani oladi: import { button } from "bahor-ui";. Build natijasi (Prettier bilan formatladik):
function e(e) {
return `<button>${e}</button>`;
}
(Array.from({ length: 200 }, (e, t) => `hsl(${t} 60% 50%)`),
(globalThis.chartTypes = [`ustun`, `chiziq`]),
(document.body.innerHTML = e(`Buyurtma`)));drawChart tashlandi — u ishlatilmaydi. Lekin chart.js ning yuqori darajadagi ikki qatori qoldi. globalThis.chartTypes = … — aniq yon ta'sir, to'g'ri. Array.from(…) esa natijasi hech qayerga yozilmagan, lekin bundler buni bilmaydi: Array.from ichida nima bo'lishi mumkin? Ehtiyot bo'lib, qoldirdi. 0.17 kB.
3.2 "sideEffects": false
Paket muallifi package.json da va'da berishi mumkin:
{
"name": "bahor-ui",
"type": "module",
"exports": "./index.js",
"sideEffects": false
}"Mening hech bir modulimda yon ta'sir yo'q — ishlatilmasa, butunlay tashla". Natija:
function e(e) {
return `<button>${e}</button>`;
}
document.body.innerHTML = e(`Buyurtma`);0.08 kB. chart.js butunlay yo'qoldi — Array.from ham, globalThis.chartTypes ham. Agar ilova chartTypes ga tayangan bo'lsa — endi u undefined. Va'da yolg'on edi, va bundler unga ishondi.
sideEffects |
Nimani anglatadi |
|---|---|
| yo'q (sukut) | har modulda yon ta'sir bo'lishi mumkin — ehtiyot |
false |
hech qayerda yo'q — ishlatilmagan modul butunlay tashlanadi |
["*.css", "./src/polyfill.js"] |
faqat shu fayllarda bor |
Uchinchi shakl eng ko'p uchraydi: kutubxonalar "sideEffects": ["*.css"] yozadi. Sabab: import "./button.css" dan hech narsa import qilinmaydi — u sof yon ta'sir (sahifaga stil qo'shadi). webpack'da sideEffects: false bunday CSS importlarini ham tashlab yuborishi mashhur tuzoq. Vite 8.3.3 da sinadik — CSS saqlandi (Vite CSS'ni alohida ishlaydi), lekin kutubxona hamma bundler uchun yoziladi.
3.3 /*#__PURE__*/
Butun modul emas, bitta chaqiruv haqida va'da — pure annotatsiya: /*#__PURE__*/ yoki /* @__PURE__ */ izohi. "Bu chaqiruvning natijasi ishlatilmasa, uni o'chirsang bo'ladi". chart.js da sideEffects siz, faqat bitta izoh bilan:
const COLORS = /* @__PURE__ */ Array.from(
{ length: 200 },
(_, i) => `hsl(${i} 60% 50%)`,
);function e(e) {
return `<button>${e}</button>`;
}
((globalThis.chartTypes = [`ustun`, `chiziq`]),
(document.body.innerHTML = e(`Buyurtma`)));0.12 kB: Array.from ketdi, haqiqiy yon ta'sir (chartTypes) qoldi. Aniq va xavfsiz. Transpilyatsiya darsida to'rttala transpiler JSX chaqiruvlari oldiga aynan shu izohni qo'ygan edi: ishlatilmagan komponent elementi ham shunday tashlanadi.
Tekshirib ko'ring: Nega bundler
Array.from(...)ni o'zi "pure" deb bilmaydi? Axir bu standart funksiya-ku.
Javob
Array.from ikkinchi argument sifatida sizning funksiyangizni chaqiradi — u ichida istalgan narsa (global'ga yozish, fetch) qilishi mumkin. Bundan tashqari, kimdir Array.from ning o'zini almashtirgan bo'lishi mumkin (polyfill). Bundler xavfsiz tomonni tanlaydi: aniq bilmasa — qoldiradi. Izoh bilan siz unga ruxsat berasiz.
4. Ikki tuzoq: barrel va import *
4.1 Barrel fayl
Barrel qulay: import { button, drawChart } from "bahor-ui" — bitta yo'l. Lekin bundler barrel orqali kelgan hamma modulni ochishi kerak: export * qaysi nomlarni berishini bilish uchun. Yon ta'siri bor modul (chart.js) — sideEffects siz — build'ga tushadi, hatto undan hech narsa ishlatilmasa ham («Muammo» bo'limidagi 0.17 kB). Katta UI kutubxonalarida bu yuzlab modul.
Davolar uchta. Kutubxona sideEffects ni to'g'ri yozsin. Yoki to'g'ridan-to'g'ri yo'ldan import qiling (bahor-ui/button.js, agar exports ruxsat bersa). O'z loyihangizda esa ichki barrel'lardan (src/utils/index.ts hammasini qayta eksport qiladi) ehtiyot bo'ling — ular dev server'ni ham sekinlashtiradi: bitta funksiya uchun o'nlab fayl so'raladi.
4.2 import *
import * as _ from "lodash-es" — "hammasi" degan ma'noda ko'rinadi. Lekin:
| Kod | Hajm | gzip |
|---|---|---|
_.sum(a) |
211 B | 169 B |
_[name](a) (name — location.hash dan) |
89 580 B | 31 870 B |
Statik ishlatilsa (_.sum), bundler ko'radi: faqat sum. Nom runtime'da hisoblansa (_[name]), bundler qaysi biri kerakligini bilolmaydi — hammasini (600+ funksiya) qo'shadi. Qoida: import * dan keyin faqat nuqta bilan, aniq nom bilan murojaat qiling.
5. Minifikatsiya va mangling
5.1 Nima o'zgaradi
Tree shaking ishlatilmagan kodni olib tashlaydi, minifikatsiya esa qolgan kodni siqadi. Kichik misol — main.js:
// main.js — chegirma hisoblash
function applyDiscount(orderTotal, discountPercent) {
const discountAmount = (orderTotal * discountPercent) / 100;
return {
total: orderTotal - discountAmount,
discount: discountAmount,
};
}
const result = applyDiscount(63000, 10);
console.log(result.total, result.discount); // 56700 6300--minify false bilan build — 0.31 kB, izohlar o'rniga //#region belgisi, nomlar to'liq. Sukut bilan (Oxc) — 0.10 kB, bitta qator:
function e(e,t){let n=e*t/100;return{total:e-n,discount:n}}var t=e(63e3,10);console.log(t.total,t.discount);| O'zgarish | Misol | Nomi |
|---|---|---|
| ichki nomlar qisqardi | orderTotal → e, discountAmount → n |
mangling |
| bo'sh joy, izoh yo'q | butun fayl — bitta qator | whitespace removal |
| raqam qisqardi | 63000 → 63e3 |
compress |
const → let |
let n= |
compress |
| xususiyat nomlari saqlandi | total, discount |
— |
Mangling ("nomlarni ezish") — mahalliy o'zgaruvchi va parametr nomlarini qisqartirish. Faqat tashqaridan ko'rinmaydigan nomlar: applyDiscount ham e bo'ldi, chunki u eksport qilinmagan. Obyekt xususiyatlari (total) esa tegilmaydi — ularni boshqa kod, JSON yoki server nomi bilan o'qishi mumkin.
5.2 Uch minifikator
Vite 8 da build.minify: "oxc" (sukut), "terser" yoki "esbuild" (ikkalasi alohida o'rnatiladi), false. vazifalar (holat #22) da har biri 5 marta, index chunk:
build.minify |
Hajm | gzip | Build vaqti (mediana) |
|---|---|---|---|
oxc (sukut) |
25.33 kB | 9.47 kB | 308 ms |
terser 5.51.2 |
25.30 kB | 9.42 kB | 1.33 s |
esbuild 0.28.2 |
25.75 kB | 9.73 kB | 340 ms |
false |
49.61 kB | 15.02 kB | 252 ms |
Mashina: Intel Core i5-12500H, Windows 11; vaqt — butun vite build. terser eng kichik (−0.05 kB gzip), lekin 4 baravar sekin. Oxc — deyarli terser hajmida, esbuild tezligida. Shuning uchun Vite 8 uni sukut qilib tanlagan. Asosiy farq esa minifikatsiyaning o'zida: 49.61 → 25.33 kB (−49 %).
5.3 vazifalar da tree shaking qancha berdi?
Kanon o'lchovi (QADAMLAR, vite.config.ts ga vaqtincha treeshake: false qo'shib):
index chunk |
olchov chunk (web-vitals) |
|
|---|---|---|
| kanon (tree shaking + minify) | 25.33 kB │ gzip 9.47 kB | 8.87 kB │ gzip 3.38 kB |
treeshake: false |
25.33 kB │ gzip 9.46 kB | 8.87 kB │ gzip 3.38 kB |
minify: false |
49.61 kB │ gzip 15.02 kB | 12.10 kB │ gzip 4.04 kB |
Tree shaking o'chsa — deyarli hech narsa o'zgarmadi (gzip'da hatto 10 bayt kam). Sabab: bu — ilova kodi, uni o'zimiz yozganmiz va ishlatilmaydigan funksiya deyarli yo'q (bo'lsa, knip darsida topamiz). web-vitals ham kichik va ESM. Tree shaking kutubxonada seziladi — Zod misolida:
| Variant | index chunk (gzip) |
Farq |
|---|---|---|
| qo'lda yozilgan tekshiruv (kanon) | 9.51 kB | — |
| Valibot 1.5.0 | 10.85 kB | +1.34 KB |
| zod/mini 4.6.5 | 15.03 kB | +5.52 KB |
| Zod 4.6.5 | 33.22 kB | +23.71 KB |
Zod bundlersiz 233.7 KB edi — tree shaking va minifikatsiya uni 23.7 KB ga tushirdi. Bu yerda import { z } from "zod" yozilgan va Vite (Rolldown) uni to'g'ri kesdi. esbuild esa xuddi shu yozuvda Zod'ning hamma til (locale) xabarlarini ham olib kelgan edi — 90.6 KB (Paket tanlash darsidagi «import { z }» tuzog'i). Demak, tree shaking natijasi bundlerga ham bog'liq: o'z bundleringizda o'lchang. Valibot esa modulli qurilgan (har tekshiruv — alohida funksiya), shuning uchun tree shaking undan faqat ishlatilganini oladi — +1.34 KB. Shunga qaramay, kanonda kutubxona yo'q: uch maydonli tekshiruvga eng arzon variant ham +14 % hajm va yangi bog'liqlik qo'shadi (Paket tanlash darsida batafsil).
6. Ko'p uchraydigan xatolar
| Xato | Oqibati | To'g'risi |
|---|---|---|
| CommonJS kutubxonadan nomli import | butun kutubxona bundle'da | ESM versiyasi (lodash-es) yoki alohida fayl |
sideEffects: false — yon ta'siri bor paketda |
polyfill, CSS yoki ro'yxatga yozish yo'qoladi | ["*.css", …] aniq ro'yxat |
import * + hisoblangan nom (_[name]) |
hammasi bundle'ga | aniq nom bilan murojaat |
| kod "minifikatsiyadan keyin ishlamadi" | xususiyat nomini satr bilan solishtirish, fn.name ga tayanish |
nomga emas, qiymatga tayaning |
To'rtinchi qator: mangling applyDiscount.name ni "e" qiladi. Funksiya yoki klass nomi bo'yicha mantiq yozgan kod (if (err.constructor.name === "VazifaXatosi")) build'dan keyin buziladi. vazifalar dagi VazifaXatosi da this.name = "VazifaXatosi" aniq satr bilan yozilgani shuning uchun (Asboblar zanjiri darsidagi minifikatsiya parchasida ko'rinadi).
7. Mashqlar
Mashqlar kurs/mashqlar/16/23-tree-shaking/ da.
1-mashq (oson): Qoladimi?
import { button } from "bahor-ui" bilan, sideEffects siz build'da nima qoladi?
drawChartfunksiyasi:globalThis.chartTypes = …qatori:COLORSmassivini yasash (Array.from, izohsiz):/* @__PURE__ */qo'shilgandan keyinArray.from:
Yechim
drawChart — ishlatilmagan eksport, tashlanadi. chartTypes — global'ga yozish, yon ta'sir — qoladi. Array.from — bundler yon ta'sirsiz ekanini bilmaydi, qoldiradi. @__PURE__ bilan — natija ishlatilmagani uchun tashlanadi. «Yon ta'sir» bo'limidagi uch build chiqishi buni tasdiqlaydi.
2-mashq (o'rta): Paket formatini tekshiring
npm view bilan uch paket tree shaking'ga qanchalik tayyorligini aniqlang: lodash, lodash-es, web-vitals. Har biri uchun type, module, sideEffects maydonlarini so'rang.
Yechim
npm view lodash-es@4.18.1 type sideEffectslodash-es: type = 'module', sideEffects = false — ESM va yon ta'sirsiz: ideal. lodash: hech biri yo'q — CommonJS, tree shaking deyarli ishlamaydi. web-vitals@6.2.3: type = 'module' (va module maydoni) — ESM. Uchta maydon tez baho beradi; aniq javobni esa faqat o'lchov beradi — 3-mashqdagi kabi.
3-mashq (qiyin): O'lchov skripti
olcha.mjs yozing: bir nechta import variantini Vite'ning JavaScript API'si (build() funksiyasi) bilan, dist/ ga yozmasdan yig'ib, har birining xom va gzip hajmini chiqarsin. Variantlar — darsdagi to'rt lodash importi.
Ishoralar: build({ configFile: false, logLevel: "silent", build: { write: false, rolldownOptions: { input: "src/entry.js" } } }) — natija xotirada. Natija massiv bo'lishi mumkin — Array.isArray bilan tekshiring. output dagi type === "chunk" elementlarning code maydoni — JS matni. gzipSync — Asboblar zanjiri darsidagi hajm.mjs dan tanish. modulePreload: { polyfill: false } — o'lchovga Vite yordamchisi aralashmasin.
Yechim
// olcha.mjs — bir nechta import usulini Vite bilan yig'ib, hajmini
// o'lchaydi (dist/ ga yozmasdan, xotirada)
import { writeFileSync } from "node:fs";
import { gzipSync } from "node:zlib";
import { build } from "vite";
const variants = {
"lodash (default)": 'import _ from "lodash"; log(_.sum(a));',
"lodash { sum }": 'import { sum } from "lodash"; log(sum(a));',
"lodash/sum.js": 'import sum from "lodash/sum.js"; log(sum(a));',
"lodash-es": 'import { sum } from "lodash-es"; log(sum(a));',
};
const PRELUDE = "const a = [35000, 28000];\nconst log = console.log;";
export async function measure(code) {
writeFileSync("src/entry.js", `${code}\n${PRELUDE}\n`);
const result = await build({
configFile: false,
logLevel: "silent",
build: {
write: false,
modulePreload: { polyfill: false },
rolldownOptions: { input: "src/entry.js" },
},
});
const { output } = Array.isArray(result) ? result[0] : result;
const js = output.filter((f) => f.type === "chunk");
const raw = js.reduce((s, f) => s + Buffer.byteLength(f.code), 0);
const gzip = js.reduce((s, f) => s + gzipSync(f.code).length, 0);
return { raw, gzip };
}
if (import.meta.main) {
for (const [name, code] of Object.entries(variants)) {
const { raw, gzip } = await measure(code);
const r = String(raw).padStart(6);
const g = String(gzip).padStart(6);
console.log(`${name.padEnd(18)} ${r} B gzip ${g} B`);
}
}npm i -E lodash@4.18.1 lodash-es@4.18.1
npm i -D -E vite@8.3.3
node olcha.mjslodash (default) 71739 B gzip 26029 B
lodash { sum } 71230 B gzip 25806 B
lodash/sum.js 893 B gzip 499 B
lodash-es 211 B gzip 169 BBu skriptga yangi variant qo'shish — bitta qator. Masalan, dayjs va date-fns ni yoki zod va valibot ni solishtirish uchun (Paket tanlash darsidagi "narxni o'lchab qaror qilish"). Lekin ishlab chiqarish build'i boshqa sozlamalar bilan ishlashi mumkin — yakuniy raqamni loyihaning o'z npm run build idan oling.
4-mashq: Amaliy tajriba — vazifalar da o'lchov
Bu darsda vazifalar kodi o'zgarmaydi — faqat o'lchaymiz. O'z loyihangizda:
npx vite build --minify false—indexchunk hajmi?vite.config.tsningbuild.rolldownOptionsiga vaqtinchatreeshake: falseqo'shib, build qiling. Farq qancha?- O'zgarishni qaytaring (
git restore vite.config.ts).
Yechim
dist/assets/index-….js 49.61 kB │ gzip: 15.02 kB— minifikatsiyasiz deyarli ikki baravar katta.25.33 kB │ gzip: 9.46 kB— kanon bilan deyarli bir xil. Ilova kodida o'lik kod deyarli yo'q.git restore— o'lchov tajribasi kanonga kirmaydi.git statustoza bo'lishi kerak.
Saboq: "tree shaking hajmni kamaytiradi" — umumiy gap. Haqiqatda nima kamaytirganini faqat o'lchov aytadi: bizda — minifikatsiya.
8. Real ishda
- Kutubxona tanlash:
npm view <paket> type module sideEffectsva bundlephobia.com kabi saytlar — "bu paket menga qancha turadi?" savoliga birinchi javob. - Kutubxona yozsangiz: ESM,
"sideEffects": false(yoki["*.css"]), modulli eksportlar — foydalanuvchilaringiz bundle'i kichik bo'ladi. - Intervyu savollari: "Tree shaking nima va qachon ishlamaydi?", "
sideEffectsnima?", "Minifikatsiya va mangling farqi?", "Negalodashemas,lodash-es?".
Xulosa
- Tree shaking — ishlatilmagan eksportlarni tashlash; faqat statik ESM bilan ishonchli, CommonJS paketda (
lodash) nomli import ham yordam bermaydi. "sideEffects": false— butun modullarni tashlashga ruxsat (yolg'on bo'lsa, yon ta'sir yo'qoladi);["*.css"]— xavfsiz shakl;/* @__PURE__ */— bitta chaqiruvga ruxsat.- Barrel fayl va
import *+ hisoblangan nom — bundle'ni jimgina kattalashtiradi. - Minifikatsiya: bo'sh joy, izoh, mangling (mahalliy nomlar), siqish; xususiyat nomlari saqlanadi. Vite 8 — Oxc (terser hajmida, esbuild tezligida).
vazifalarda hajmni minifikatsiya kamaytirdi (−49 %), tree shaking — kutubxonada (Zod 233.7 → 23.7 KB).
Keyingi dars: Source map'lar — minifikatsiyadan keyin e(e,t) dagi xatoni qanday qilib asl .ts fayl va qatorga qaytarish mumkin; vazifalar ga source map qo'shamiz.
Manbalar
- Rollup/Rolldown: "Tree-shaking",
treeshakevamoduleSideEffects— rollupjs.org/configuration-options/#treeshake, rolldown.rs - webpack: "Tree Shaking → Mark the file as side-effect-free" (
sideEffects, CSS tuzog'i) — webpack.js.org/guides/tree-shaking - Vite: "Build Options → build.minify" — vite.dev/config/build-options
- Oxc: "Minifier" — oxc.rs/docs/guide/usage/minifier
- lodash-es — npmjs.com/package/lodash-es
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!