Перейти к содержимому

1. Что такое Nuxt 3

Nuxt 3 — это мета-фреймворк поверх Vue 3. Если Vue — это двигатель, то Nuxt — это полноценный автомобиль с навигатором, климат-контролем и парковочными камерами. Ты садишься и едешь, не думая о том, как собрать машину с нуля.


Создание современного Vue-приложения без Nuxt требует:

Окно терминала
npm install vue@3
npm install vue-router@4 # Маршрутизация
npm install pinia # Стейт-менеджмент
npm install vite # Сборщик
npm install @vitejs/plugin-vue # Vue плагин
# SSR? Придётся настраивать вручную
# API сервер? Нужен отдельный Express/Fastify
# SEO? Плагины, конфиги...
# Автоимпорт? unplugin-auto-import, настройка...

С Nuxt 3:

Окно терминала
npx nuxi@latest init my-app
cd my-app && npm install && npm run dev
# Готово! SSR, роутинг, авто-импорт, TypeScript — всё работает

Браузер
Vue 3 (UI Framework)
Nuxt 3 (Meta-Framework)
├── Файловая маршрутизация
├── SSR / SSG / SPA / ISR
├── Авто-импорт
├── Nitro Server (API)
├── TypeScript из коробки
└── Dev Experience

Мета-фреймворк добавляет соглашения и инфраструктуру поверх базового фреймворка. Тебе не нужно принимать тысячи решений — Nuxt принял их за тебя, оставив возможность переопределить любое.


Nitro — это сервер-движок Nuxt 3, написанный командой UnJS. Главная суперсила Nitro — универсальность:

Окно терминала
# Nitro может деплоиться на:
Node.js
Vercel (Edge Functions)
Cloudflare Workers
AWS Lambda
Deno Deploy
Bun
Netlify Functions
# Один код — любая платформа

Nitro также отвечает за:

  • 📦 Bundling — умная сборка сервера
  • 🗄️ Storage — абстракция над файловой системой/KV
  • 🔄 Auto-import на сервере
  • 💾 Caching — встроенное кэширование

Nuxt 3 построен на UnJS — коллекции универсальных JavaScript пакетов:

ПакетРольПример
H3HTTP серверdefineEventHandler(event => 'hello')
ofetchHTTP клиент$fetch('/api/users')
defuСлияние объектовdefu(userConfig, defaultConfig)
ufoURL утилитыjoinURL('/api', 'users')
patheПутиjoin('src', 'components')
consolaЛогированиеconsola.success('Server started')
jitiTS/ESM рантаймЗапуск .ts файлов без сборки
nitropackСервер-бандлерКомпиляция Nitro приложений
mllyESM утилитыРезолюция модулей

Nuxt работает из коробки без единой строки конфига:

my-nuxt-app/
├── pages/
│ ├── index.vue → /
│ └── about.vue → /about
├── components/
│ └── MyButton.vue → авто-импорт <MyButton>
├── composables/
│ └── useCounter.ts → авто-импорт useCounter()
└── server/
└── api/
└── hello.ts → GET /api/hello

При этом nuxt.config.ts позволяет настроить всё:

nuxt.config.ts
export default defineNuxtConfig({
// Режим рендеринга
ssr: true,
// Tailwind CSS
modules: ['@nuxtjs/tailwindcss'],
// Runtime конфиг
runtimeConfig: {
apiSecret: process.env.API_SECRET,
public: {
apiBase: process.env.API_BASE_URL
}
},
// Мета-теги для всего приложения
app: {
head: {
title: 'My Nuxt App',
meta: [
{ name: 'description', content: 'My amazing app' }
]
}
}
})

Это самая обсуждаемая фича Nuxt. Понимание её принципа работы важно:

components/
Button.vue → <Button>
ui/
Card.vue → <UiCard> или <Card>
form/
Input.vue → <UiFormInput>
composables/
useAuth.ts → useAuth()
utils/
useFormat.ts → useFormat()
utils/
formatDate.ts → formatDate()
helpers/
truncate.ts → truncate()

Как это работает под капотом:

Nuxt сканирует директории при старте и генерирует .nuxt/imports.d.ts — файл с объявлениями типов для всех авто-импортированных сущностей. Vite плагин unplugin-auto-import добавляет настоящие импорты во время сборки.

// Ты пишешь:
const { data } = await useFetch('/api/users')
// Nuxt компилирует в:
import { useFetch } from '#imports'
const { data } = await useFetch('/api/users')

Nuxt 3 поддерживает разные режимы рендеринга на каждый роут:

nuxt.config.ts
export default defineNuxtConfig({
routeRules: {
// Главная страница — статическая генерация
'/': { prerender: true },
// Блог — ISR (перегенерация каждые 10 минут)
'/blog/**': { isr: 600 },
// Дашборд — только клиент (SPA)
'/dashboard/**': { ssr: false },
// API с CORS заголовками
'/api/**': { cors: true },
// Страница с кэшированием
'/products': { cache: { maxAge: 60 * 60 } },
// Редирект
'/old-page': { redirect: '/new-page' },
}
})

Весь Vue 3 работает в Nuxt без изменений:

<script setup lang="ts">
// Composition API — работает
const count = ref(0)
const doubled = computed(() => count.value * 2)
// Vue Router через Nuxt composables
const route = useRoute()
const router = useRouter()
// Lifecycle hooks
onMounted(() => console.log('mounted'))
onUnmounted(() => console.log('unmounted'))
// Props и Emits
const props = defineProps<{
title: string
count?: number
}>()
const emit = defineEmits<{
update: [value: number]
}>()
</script>

КритерийNuxt 3 (Vue)Next.js 14 (React)
Язык шаблоновVue SFC (.vue)JSX/TSX
РеактивностьVue Proxy (авто)useState/hooks
Авто-импорт✅ Встроен❌ Ручной
Файловые роутыpages/app/ или pages/
СерверNitro (универсальный)Node.js/Edge
Server Components🏝️ Nuxt Islands✅ React Server Components
СтейтPinia / useStateZustand / Redux / Context
Кривая обучения🟢 Пологая🟡 Средняя
Размер бандла~100KB~130KB
SEO из коробки✅ useSeoMeta✅ Metadata API
Edge Runtime✅ Nitro✅ Next.js Edge
Экосистема модулей200+1000+ (npm)
КомпанииGitLab, DeezerVercel, Notion
Тренд📈 Растёт📈 Доминирует

Когда Nuxt лучше:

  • Команда знает/любит Vue
  • Нужен минимум конфигурации
  • Важна читаемость шаблонов
  • Full-stack с универсальным деплоем

Когда Next.js лучше:

  • Команда React-ориентированная
  • Нужны React Server Components
  • Огромная экосистема компонентов
  • Деплой на Vercel

Nuxt 1 (2016) — Vue 2, Webpack, SSR
Nuxt 2 (2018) — Vue 2, Webpack 4, Vuex, лучший DX
Nuxt Bridge (2021) — миграционный мост Nuxt 2→3
Nuxt 3.0 (2022) — Vue 3, Vite, Nitro, Composition API
Nuxt 3.x (2022-2024) — улучшения, Nuxt DevTools
Nuxt 4 (2024) — новая структура папок, улучшения

my-nuxt-app/
├── .nuxt/ ← Генерируется автоматически
├── .output/ ← Production build
├── assets/ ← CSS, шрифты, SVG (обрабатывает Vite)
├── components/ ← Vue компоненты (авто-импорт)
├── composables/ ← Vue composables (авто-импорт)
├── content/ ← Markdown файлы (@nuxt/content)
├── layouts/ ← Шаблоны страниц
├── middleware/ ← Route middleware
├── pages/ ← Страницы (файловый роутинг)
├── plugins/ ← Nuxt плагины
├── public/ ← Статические файлы (не обрабатывает Vite)
├── server/
│ ├── api/ ← API маршруты
│ ├── middleware/ ← Серверный middleware
│ ├── plugins/ ← Nitro плагины
│ └── utils/ ← Серверные утилиты
├── utils/ ← Клиентские утилиты (авто-импорт)
├── app.vue ← Корневой компонент
├── error.vue ← Страница ошибки
├── nuxt.config.ts ← Конфигурация Nuxt
└── package.json

nuxt.config.ts
export default defineNuxtConfig({
runtimeConfig: {
// Только сервер
dbPassword: process.env.DB_PASSWORD,
jwtSecret: process.env.JWT_SECRET,
// Клиент + сервер
public: {
apiBase: process.env.NUXT_PUBLIC_API_BASE || '/api',
appName: 'My App',
}
}
})
<script setup>
// Клиентский код
const config = useRuntimeConfig()
console.log(config.public.apiBase) // '/api'
// config.dbPassword — undefined на клиенте!
</script>
server/api/data.ts
export default defineEventHandler((event) => {
const config = useRuntimeConfig(event)
const secret = config.dbPassword // Доступно только здесь!
// ...
})

Nuxt 3 поставляется с Nuxt DevTools — встроенным инструментом для разработки:

Окно терминала
# DevTools включены по умолчанию в dev режиме
npm run dev
# Жми на логотип Nuxt в левом нижнем углу браузера

DevTools показывают:

  • 📊 Все страницы и маршруты
  • 🧩 Используемые компоненты
  • 🪝 Composables и их использование
  • 📦 Установленные модули
  • 📡 Все API запросы
  • 🎨 Tailwind/UnoCSS утилиты
  • ⚡ Производительность