22. Производительность
⚡ Производительность Nuxt 3
Заголовок раздела «⚡ Производительность Nuxt 3»Nuxt 3 предоставляет широкий набор инструментов для оптимизации производительности: от автоматической оптимизации бандла до edge-деплоя ближе к пользователю.
📦 Payload Extraction
Заголовок раздела «📦 Payload Extraction»payloadExtraction позволяет отделить данные страницы от JavaScript-бандла:
export default defineNuxtConfig({ experimental: { payloadExtraction: true }})При статической генерации Nuxt создаёт отдельный _payload.json для каждой страницы:
dist/├── _nuxt/ # JS/CSS бандлы├── about/│ ├── index.html│ └── _payload.json # данные страницы└── blog/ ├── my-post/ │ ├── index.html │ └── _payload.jsonПреимущества:
- Меньший начальный HTML
- Данные загружаются параллельно со скриптами
- Лучший кеш для повторных посещений
🔄 NuxtLoadingIndicator
Заголовок раздела «🔄 NuxtLoadingIndicator»Встроенный индикатор загрузки при навигации:
<template> <div> <NuxtLoadingIndicator :height="3" :duration="2000" :throttle="200" color="#00dc82" /> <NuxtLayout> <NuxtPage /> </NuxtLayout> </div></template>// Кастомизация через CSS.nuxt-loading-indicator { background: linear-gradient(90deg, #00dc82, #00b4d8) !important;}🔗 Preloading и Prefetching с NuxtLink
Заголовок раздела «🔗 Preloading и Prefetching с NuxtLink»<!-- Prefetch при наведении (по умолчанию) --><NuxtLink to="/about" prefetch>О нас</NuxtLink>
<!-- Немедленный prefetch при монтировании --><NuxtLink to="/dashboard" prefetch prefetch-on="mount"> Дашборд</NuxtLink>
<!-- Prefetch только при видимости в viewport --><NuxtLink to="/products" prefetch prefetch-on="visible"> Продукты</NuxtLink>
<!-- Без prefetch --><NuxtLink to="/admin" :prefetch="false"> Администрирование</NuxtLink>// Глобальная настройка prefetchexport default defineNuxtConfig({ experimental: { defaults: { nuxtLink: { prefetch: true, prefetchOn: { visibility: true, interaction: true } } } }})🔥 Оптимизация бандла
Заголовок раздела «🔥 Оптимизация бандла»Анализ размера бандла
Заголовок раздела «Анализ размера бандла»npm install -D rollup-plugin-visualizer
# Запуск анализаnuxt build --analyze# илиNUXT_ANALYZE=true nuxt buildexport default defineNuxtConfig({ build: { analyze: { analyzerMode: 'server', openAnalyzer: true } }})Разделение чанков
Заголовок раздела «Разделение чанков»export default defineNuxtConfig({ vite: { build: { rollupOptions: { output: { manualChunks: { 'vendor-vue': ['vue', 'vue-router'], 'vendor-utils': ['lodash-es', 'date-fns'], 'ui-components': ['@headlessui/vue', '@heroicons/vue'] } } } } }})💾 Кеширование
Заголовок раздела «💾 Кеширование»Route Rules (Nitro)
Заголовок раздела «Route Rules (Nitro)»export default defineNuxtConfig({ routeRules: { // Статический HTML (SGS) '/': { prerender: true },
// Кеш на CDN 1 час '/blog/**': { swr: 3600 },
// Кеш на 1 день + ISR '/docs/**': { isr: 86400 },
// Без кеша (всегда SSR) '/dashboard/**': { ssr: true },
// Только клиент (SPA) '/app/**': { ssr: false },
// Редирект '/old-path': { redirect: '/new-path' } }})Кеширование API-ответов
Заголовок раздела «Кеширование API-ответов»export default defineCachedEventHandler(async (event) => { const posts = await fetchPopularPosts() return posts}, { maxAge: 60 * 10, // 10 минут name: 'popular-posts', getKey: () => 'popular-posts'})🛠️ Nuxt DevTools
Заголовок раздела «🛠️ Nuxt DevTools»Nuxt DevTools — встроенный инструмент разработки:
export default defineNuxtConfig({ devtools: { enabled: true, // Все вкладки tabs: true, // Профилировщик Vue vueInspector: true }})Возможности DevTools:
- 📊 Анализ компонентов и страниц
- 🔌 Просмотр загруженных модулей и плагинов
- 🗃️ Инспектор состояния (Pinia stores)
- 🌐 Просмотр серверных маршрутов
- 📦 Анализ импортов и автоимпортов
🌐 Edge Deployment
Заголовок раздела «🌐 Edge Deployment»Nitro поддерживает деплой на edge-платформы:
// nuxt.config.ts — деплой на Cloudflare Workersexport default defineNuxtConfig({ nitro: { preset: 'cloudflare-pages' }})// Vercel Edge Functionsexport default defineNuxtConfig({ nitro: { preset: 'vercel-edge' }, routeRules: { '/api/**': { headers: { 'x-vercel-cache': 'MISS' } } }})📈 Web Vitals оптимизация
Заголовок раздела «📈 Web Vitals оптимизация»Core Web Vitals в Nuxt
Заголовок раздела «Core Web Vitals в Nuxt»LCP (Largest Contentful Paint):
<!-- Preload critical images --><NuxtImg src="/hero.jpg" preload loading="eager" :placeholder="false" fetchpriority="high"/>CLS (Cumulative Layout Shift):
<!-- Всегда задавайте width/height --><NuxtImg src="/photo.jpg" width="800" height="600" alt="Фото"/>FID/INP (Interaction to Next Paint):
// Ленивая загрузка тяжёлых компонентовconst HeavyChart = defineAsyncComponent(() => import('~/components/HeavyChart.vue'))🗜️ Сжатие и минификация
Заголовок раздела «🗜️ Сжатие и минификация»export default defineNuxtConfig({ nitro: { compressPublicAssets: { gzip: true, brotli: true }, minify: true }, vite: { build: { minify: 'esbuild', cssMinify: true, reportCompressedSize: true } }})📋 Чеклист производительности
Заголовок раздела «📋 Чеклист производительности»| Оптимизация | Инструмент | Влияние |
|---|---|---|
| Оптимизация изображений | @nuxt/image | Высокое |
| Code splitting | Vite автоматически | Высокое |
| SSR/SSG/ISR | routeRules | Высокое |
| Edge deployment | Nitro presets | Высокое |
| Prefetching | NuxtLink | Среднее |
| Payload extraction | experimental | Среднее |
| Bundle analysis | rollup-visualizer | Диагностика |
| Compression | Nitro | Среднее |