Оптимизация производительности во Vue

↑ 7.1 Vue под капотом · ← Предыдущая · → Следующая

Желательно~3 мин чтенияУровень: senior

Зачем это на собесе

Практический вопрос: «приложение тормозит, что вы будете делать». Нужен порядок действий, а не список приёмов.

Сначала измерить

Vue DevTools (Performance, Timeline), Chrome Performance, app.config.performance = true. Ищем: лишние рендеры, тяжёлые вычисления, большие списки.

Приёмы

ПроблемаРешение
Лишние ре-рендеры детейстабильные props, defineProps по точным полям, computed вместо инлайн-выражений
Большой объект реактивен зряshallowRef, markRaw, shallowReactive
Длинный списоквиртуализация (vue-virtual-scroller, @tanstack/vue-virtual)
Статичное поддеревоv-once
Дорогой блок в спискеv-memo="[item.id, item.selected]"
Тяжёлые компонентыdefineAsyncComponent, lazy routes
Дорогие вычисленияcomputed (кэш), вынос в Web Worker
Переключение вкладок<KeepAlive>
Всплеск watchwatchEffect осторожно, debounce

Примеры

<div v-for="row in rows" :key="row.id" v-memo="[row.id, row.selected]">
  <ExpensiveRow :row="row" />
</div>
const HeavyChart = defineAsyncComponent(() => import('./HeavyChart.vue'))

Ловушки

  • computed с побочными эффектами или тяжёлым кодом, зависящим от многого;
  • v-if и v-show: v-if дороже при частом переключении, но экономит первый рендер;
  • передача новой функции или объекта в props при каждом рендере вызывает лишнее обновление ребёнка;
  • глубокие watch на больших структурах.

Вопросы с ответами