Как я оптимизировала фронт на 40% и никто не заметил

Предыстория
Когда я помогала с поиском сотрудника и просматривала резюме на фронтенд разработчика, очень часто встречала фразу - "Оптимизировал(а) размер бандла на 30% / 40% / 50%, что увеличило ..." как под копирку от ИИ, а у меня из достижений в резюме - "делаю задачи и фикшу баги"
Ну что ж, возьмем свое приложение и оптимизируем его
О приложении
Это небольшое SPA на Vue 3 для администрирования справочников. Ничего особенного, но это приложение экономит время программистам, которые не лезут в БД, и, как мне кажется, полезно для аналитиков и QA - это позволяет лучше понять, как устроена база, и почему иногда что-то не работает как ожидается.
Начнем оптимизацию
Запускаем npx vite-bundle-visualizer и получаем вот такую красивую розовую визуализацию (прикрепила бы скрин, на то что получилось, но в пост можно одну картинку добавить)
Смотрим роутинг у приложения... Все роуты импортируются сразу. Применяем легкий фикс:
Оставляем синхронный импорт только для страниц, которые первыми открываются у пользователей
Остальные подгружаем отдельно с помощью lazy import
// Было: import PaymentTypes from '@/views/Directories/PaymentType/PaymentTypes.vue'; import OrderTypes from '@/views/Directories/OrderType/OrderTypes.vue'; import Configurations from '@/views/Directories/Configuration/Configurations.vue'; import NewConfiguration from '@/views/Directories/Configuration/NewConfiguration.vue'; import ConfigurationPage from '@/views/Directories/Configuration/ConfigurationPage.vue'; import Source from '@/views/Directories/Source/Source.vue'; import City from '@/views/Directories/City/City.vue'; import Brand from '@/views/Directories/Brand/Brand.vue'; import CloseReason from '@/views/Directories/CloseReason/CloseReason.vue'; import ChangeReason from '@/views/Directories/ChangeReason/ChangeReason.vue'; import Restaurants from '@/views/Directories/Restaurants/Restaurants.vue'; import RestaurantPage from '@/views/Directories/Restaurants/RestaurantPage.vue'; import NewRestaurant from '@/views/Directories/Restaurants/NewRestaurant.vue'; import Discounts from '@/views/Directories/Discounts/Discounts.vue'; import PriceTypes from '@/views/Directories/PriceType/PriceTypes.vue';
// Стало: children: [ { path: 'brand', name: 'Бренды', component: () => import('@/views/Directories/Brand/Brand.vue'), // <--тут meta: { breadcrumbs: ['Справочники', 'Бренды'], requiresAuth: true, permissions: ['admin.admin'], title: 'Бренды', section: 'directories', }, }, ... ]
Запускаем снова и уже получаем уже разбитый бандл. Code Splitting работает, вывод сборки теперь показывает множество маленьких JS-файлов для каждой страницы.
Итоги оптимизации:
Уменьшили основной бандл с 245 kB до 148 kB (gzip) — это минус 39%
Что получили:
✅ Оптимизировала размер бандла на 40%
✅ Улучшила First Contentful Paint
✅ Внедрила code splitting
✅ Повысила производительность
✅ Уменьшила основной JavaScript-файл почти на 40% (в gzip)
✅ Уменьшила сырой размер на 46%
✅ Теперь загружается только то, что нужно для текущей страницы
Реальность:
❌ Съэкономил ли бизнес деньги? - Нет
❌ Выросла ли конверсия? - Как? 🌝 это внутренний админ-интерфейс
❌ Применили ли чудо-технологию? - Нет, добавили lazy import из коробки фреймворка и рекомендацией из документации
❌ Кто-то это заметил? - Только я в отчете, "на глаз" даже мне не заметно
❌ Заметил ли пользователь? - Нет, потому что основное время все равно уходит на получение данных с backend
Мысли по этому поводу
И так, мы теперь можем добавить заветную строчку в резюме!
А вы встречаете эту строчку в резюме?
Какие чувства она у вас вызывает?
Красный флаг ли она для вас?
Или наоборот - показатель того, что человек думает о производительности?
Мой канал о поиске работы (ничего не продаю и не рекламирую, только себя)
