From 11faf086a4b8f7dafce3d5ca821f7c60df91b192 Mon Sep 17 00:00:00 2001 From: "Zimin A.N." Date: Tue, 5 May 2026 17:32:33 +0300 Subject: [PATCH] =?UTF-8?q?perf(admin-ui):=20manualChunks=20splits=20vendo?= =?UTF-8?q?r=20=D0=BF=D0=BE=20domain=20=E2=86=92=20=D0=BB=D1=83=D1=87?= =?UTF-8?q?=D1=88=D0=B5=20=D0=BA=D1=8D=D1=88=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit До: 1 chunk index-XXX.js 2 МБ / 703 КБ gzip — любой commit инвалидирует весь. После: 10 chunks. Vendor стабилен и кэшируется, при правке кода только main (18 КБ gz) перезагружается: vendor-react 194 / 60 gz (rare changes) vendor-tanstack 127 / 40 gz vendor-forms 145 / 46 gz (react-hook-form + ajv) vendor-nstart-ui 1229 /465 gz (corp UI — brand assets + stickers) vendor-icons 62 / 13 gz (phosphor) vendor-auth 72 / 19 gz (oidc-client-ts + react-oidc-context) vendor-i18n 56 / 18 gz vendor-net 42 / 17 gz (axios + crypto) vendor-misc 15 / 6 gz index (main) 67 / 19 gz ← наш код vendor-nstart-ui всё ещё 465 КБ gz — доминирует. Это brand assets (stickers, lottie animations) которые eager-imported в библиотеке. Дальнейший win требует tree-shaking в @nstart/ui — отдельная задача. --- ordinis-admin-ui/vite.config.ts | 46 +++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/ordinis-admin-ui/vite.config.ts b/ordinis-admin-ui/vite.config.ts index a0cd96f..9108311 100644 --- a/ordinis-admin-ui/vite.config.ts +++ b/ordinis-admin-ui/vite.config.ts @@ -25,4 +25,50 @@ export default defineConfig({ }, }, }, + build: { + chunkSizeWarningLimit: 600, + rollupOptions: { + output: { + // Группировка по принципу: что меняется редко → отдельный chunk → + // браузер кэширует надолго. Что меняется часто (наш код) — в main. + manualChunks: (id) => { + if (!id.includes('node_modules')) return undefined + + // React core — стабильный, основа всего + if (id.match(/node_modules\/(react|react-dom|scheduler)\//)) return 'vendor-react' + + // TanStack — Router + Query, крупные но стабильные + if (id.includes('node_modules/@tanstack/')) return 'vendor-tanstack' + + // @nstart/ui — самый тяжёлый: brand stickers/animations + tons of UI + // (проверяй динамически: lottie, echarts если есть, motion) + if (id.includes('node_modules/@nstart/ui')) return 'vendor-nstart-ui' + + // Иконки — отдельно, ленивая загрузка эффективна + if (id.includes('node_modules/@phosphor-icons/')) return 'vendor-icons' + + // Формы + JSON Schema валидация + if (id.match(/node_modules\/(react-hook-form|@hookform|ajv|ajv-formats)\//)) { + return 'vendor-forms' + } + + // OIDC / auth + if (id.match(/node_modules\/(oidc-client-ts|react-oidc-context)\//)) { + return 'vendor-auth' + } + + // i18next — отдельно + if (id.match(/node_modules\/(i18next|react-i18next|i18next-browser-languagedetector)\//)) { + return 'vendor-i18n' + } + + // Axios + парсеры + if (id.match(/node_modules\/(axios|jose|crypto-js)\//)) return 'vendor-net' + + // Остальное — в общий vendor (не должно быть много) + return 'vendor-misc' + }, + }, + }, + }, })