Web Vitals — это набор ключевых показателей производительности веб-страниц, разработанных Google для оценки пользовательского опыта. В контексте приложений на Nuxt эти метрики помогают анализировать загрузку страницы, интерактивность и визуальную стабильность интерфейса. Основные показатели включают Largest Contentful Paint (LCP), First Input Delay (FID), Cumulative Layout Shift (CLS), а также дополнительные метрики вроде First Contentful Paint (FCP) и Time to First Byte (TTFB).
Для работы с метриками Web Vitals используется пакет
web-vitals. Установка производится через npm или yarn:
npm install web-vitals
# или
yarn add web-vitals
В Nuxt оптимальным местом для интеграции метрик является плагин.
Создается файл, например, plugins/web-vitals.client.js, где
подключается библиотека и настраивается отправка данных:
import { getCLS, getFID, getLCP, getFCP, getTTFB } from 'web-vitals'
export default ({ app }, inject) => {
function sendToAnalytics(metric) {
// Пример отправки данных на сервер аналитики
fetch('/api/metrics', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(metric),
})
}
getCLS(sendToAnalytics)
getFID(sendToAnalytics)
getLCP(sendToAnalytics)
getFCP(sendToAnalytics)
getTTFB(sendToAnalytics)
}
Ключевой момент: .client.js нужен для того, чтобы скрипт
выполнялся только на клиенте, так как метрики измеряются в реальном
окружении пользователя.
Largest Contentful Paint (LCP) измеряет время, за которое основной контент страницы становится видимым. Для SPA-приложений на Nuxt LCP критичен на этапе первичной отрисовки и при динамических загрузках компонентов.
Способы оптимизации LCP:
<link rel="preload"> для крупных изображений или
шрифтов.<NuxtImg> с lazy для элементов ниже
фолд.font-display: swap и минимизация количества
веб-шрифтов.Пример внедрения preloading шрифта в nuxt.config.js:
head: {
link: [
{ rel: 'preload', href: '/fonts/Inter.woff2', as: 'font', type: 'font/woff2', crossorigin: 'anonymous' }
]
}
First Input Delay (FID) измеряет задержку реакции страницы на первое взаимодействие пользователя (клик, скролл, ввод текста). Для Nuxt SPA FID может увеличиваться из-за больших пакетов JavaScript.
Рекомендации:
defineAsyncComponent.Пример динамического импорта компонента в Nuxt:
const AsyncComponent = defineAsyncComponent(() => import('~/components/HeavyComponent.vue'))
Cumulative Layout Shift (CLS) фиксирует непредсказуемое смещение элементов на странице. Основные причины — изображения без размеров, поздняя подгрузка шрифтов и динамический контент.
Методы уменьшения CLS:
width и height либо использование Nuxt
Image.font-display: swap.Пример Nuxt Image с заданными размерами:
<NuxtImg src="/hero.jpg" width="1200" height="600" />
Оптимизация TTFB:
nitro для серверных функций в Nuxt
3.Web Vitals можно отправлять в любую систему аналитики. Для Google Analytics 4:
function sendToGA({ name, value }) {
gtag('event', name, {
event_category: 'Web Vitals',
value: Math.round(name === 'CLS' ? value * 1000 : value),
non_interaction: true
})
}
getCLS(sendToGA)
getFID(sendToGA)
getLCP(sendToGA)
Для Nuxt 3 рекомендуется создавать composable
useWebVitals.js, который можно подключать в
app.vue или отдельных страницах для централизованного сбора
метрик.
Эта комбинация подходов позволяет системно контролировать ключевые показатели пользовательского опыта в приложениях на Nuxt, обеспечивая высокую производительность и стабильность интерфейса.