Vue.js использует реактивную систему для отслеживания изменений в состоянии компонентов. Основной принцип производительности заключается в минимизации лишних перерасчетов и рендеров. Для этого применяются:
Вычисляемые свойства (computed) —
кэшируются до тех пор, пока их зависимости не изменятся. В отличие от
методов, которые выполняются при каждом рендере, вычисляемые свойства
обновляются только при необходимости.
Наблюдатели (watch) — позволяют
отслеживать изменения конкретных свойств и выполнять дорогостоящие
операции только тогда, когда это действительно нужно. Особенно полезны
для асинхронных запросов или сложной логики.
export default {
data() {
return {
items: [],
filter: ''
};
},
computed: {
filteredItems() {
return this.items.filter(item => item.includes(this.filter));
}
},
watch: {
filter(newVal) {
console.log(`Фильтр изменён на: ${newVal}`);
}
}
}
Мелкие, специализированные компоненты повышают читаемость и повторное использование кода. Но также они важны для производительности:
Разделение на компоненты позволяет Vue эффективно определять, какие части DOM требуют обновления.
Ленивый рендеринг (v-if и
v-show) управляет видимостью элементов без лишнего
создания и уничтожения виртуального DOM.
v-if полностью добавляет или удаляет элементы из DOM,
что полезно для редко используемых блоков.v-show изменяет только CSS-свойство
display, быстрее при частой смене состояния.<div v-if="isVisible">Контент загружается...</div>
<div v-show="isVisible">Контент видим</div>
v-for и keyПри работе с большими массивами важно правильно использовать
key, чтобы Vue мог эффективно отслеживать
изменения элементов:
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
vue-virtual-scroller), чтобы
отрисовывались только видимые элементы.Для крупных приложений имеет смысл разделять код на чанки (chunks) и загружать компоненты по мере необходимости:
const AsyncComponent = () => import('./MyComponent.vue');
export default {
components: {
AsyncComponent
}
}
methods: {
handleScroll: _.throttle(function() {
console.log('Скролл обработан');
}, 200)
}
computed: {
expensiveCalculation: memoize(function() {
return heavyFunction(this.data);
})
}
v-once
и v-memov-once позволяет отрисовать элемент только один
раз, что идеально для статического контента.v-memo, позволяющий
Vue пропускать повторный рендер элемента, если
зависимости не изменились.<span v-once>Статический текст</span>
Для реальной оптимизации важно измерять производительность, а не предполагать узкие места. Vue DevTools предоставляет вкладку Performance, где отображаются:
Использование этих инструментов позволяет выявлять тяжёлые вычисления и лишние рендеры, которые можно оптимизировать с помощью описанных методов.
key и виртуализация ускоряют
рендер больших списков.Каждый из этих подходов в совокупности позволяет значительно повысить скорость рендеринга и отзывчивость интерфейса в приложениях на Vue.js.