Кэширование является ключевым элементом оптимизации производительности приложений на Vue.js, особенно при работе с большими данными или часто повторяющимися вычислениями. В контексте Vue.js кэширование может реализовываться на уровне компонентов, вычисляемых свойств и маршрутов.
keep-aliveКомпонент keep-alive позволяет сохранять состояние
дочерних компонентов при их удалении из DOM, предотвращая повторное
создание и рендеринг. Это особенно полезно для вкладок, динамических
маршрутов или модальных окон.
<template>
<keep-alive include="UserProfile, Dashboard">
<component :is="currentComponent"></component>
</keep-alive>
</template>
<script>
export default {
data() {
return {
currentComponent: 'Dashboard'
};
}
};
</script>
Ключевые моменты:
include задаёт список компонентов, которые
будут кэшироваться.exclude позволяет исключить компоненты из
кэширования.:is.activated и
deactivated, которые вызываются при активации и деактивации
кэшированного компонента.В Vue.js вычисляемые свойства (computed properties) автоматически кэшируются на основе реактивных зависимостей. Это снижает нагрузку на рендеринг и позволяет повторно использовать вычисленные значения без лишних пересчётов.
<script>
export default {
data() {
return {
items: [1, 2, 3, 4, 5]
};
},
computed: {
doubledItems() {
return this.items.map(item => item * 2);
}
}
};
</script>
Особенности кэширования computed properties:
vue-routerДля сложных SPA-приложений кэширование маршрутов улучшает
пользовательский опыт, уменьшая время загрузки при переходах между
страницами. В vue-router компоненты можно кэшировать через
keep-alive на уровне <router-view>.
<template>
<keep-alive>
<router-view v-slot="{ Component }">
<component :is="Component"></component>
</router-view>
</keep-alive>
</template>
Советы по кэшированию маршрутов:
include, если кэшировать
только определённые маршруты.activated и
deactivated для загрузки данных только при
необходимости.Кэширование данных из API может быть реализовано на клиентской
стороне с использованием реактивных свойств или специализированных
библиотек (axios-cache-adapter, swrv).
Основная идея — хранить результат запроса и использовать его повторно,
избегая лишних сетевых вызовов.
<script>
import axios from 'axios';
import { ref } from 'vue';
export default {
setup() {
const users = ref([]);
const cache = {};
const fetchUsers = async () => {
if (cache['users']) {
users.value = cache['users'];
return;
}
const response = await axios.get('/api/users');
users.value = response.data;
cache['users'] = response.data;
};
return { users, fetchUsers };
}
};
</script>
Ключевые моменты:
localStorage,
sessionStorage или IndexedDB.Vue.js поддерживает использование мемоизации для функций, которые
выполняют тяжёлые вычисления. В setup API мемоизация может
быть реализована через computed или сторонние библиотеки
(lodash.memoize).
import { computed, ref } from 'vue';
import memoize from 'lodash.memoize';
export default {
setup() {
const numbers = ref([1, 2, 3, 4, 5]);
const heavyCalculation = memoize((nums) => nums.reduce((a, b) => a + b * 2, 0));
const result = computed(() => heavyCalculation(numbers.value));
return { result };
}
};
Преимущества мемоизации:
Правильная стратегия кэширования зависит от типа данных и сценария использования:
| Тип данных | Стратегия кэширования | Инструменты |
|---|---|---|
| Компоненты UI | keep-alive |
Vue.js |
| Вычисленные значения | computed |
Vue.js |
| Маршруты SPA | keep-alive + router-view |
Vue Router |
| API-запросы | Кэш в памяти / localStorage / IndexedDB | Axios, swrv |
| Тяжёлые вычисления | Мемоизация | lodash.memoize, computed |
Эффективное кэширование позволяет значительно сократить время отклика приложения, уменьшить нагрузку на сервер и улучшить пользовательский опыт.