Алексей Иванов
Что такое Nuxt 4 - обзор ключевых изменений
Введение
Nuxt 4 — это современная версия популярного фреймворка для создания приложений на Vue, которая значительно отличается от предыдущих релизов и приносит свежий взгляд на разработку Full-Stack и Frontend приложений. Если вы уже пользовались Nuxt 2 или 3, наверняка заметили, как активно развивается экосистема, упрощая жизнь разработчикам и одновременно добавляя новые возможности. Nuxt 4 поддерживает актуальные спецификации Vue, интеграцию с Vite, улучшенную серверную обработку и увеличивает производительность, сохраняя при этом простоту конфигурирования.
В этой статье я расскажу вам, что нового появилось в Nuxt 4, как изменились подходы к разработке модулей, роутинга, SSR и API, приведу примеры кода и дам рекомендации по использованию новых возможностей. Давайте посмотрим, чем Nuxt 4 отличается от своих предшественников и что он может предложить вашему проекту.
Обзор архитектуры Nuxt 4
Переход к Native ES Modules
В Nuxt 4 полностью перешли на использование ES-модулей (.mjs
) для конфигурации и всех внутренних механизмов. Это обеспечивает нативную поддержку современных инструментов и повышает совместимость с экосистемой.
// nuxt.config.mjs — основной конфиг теперь обязательно .mjs
export default defineNuxtConfig({
modules: [
'@nuxt/image'
],
ssr: true
})
// Тут мы подключаем модуль работы с изображениями и включаем SSR
Обратите внимание: старые конфигурации на CommonJS (nuxt.config.js
) не будут поддерживаться. Такое новшество сокращает возможные ошибки и обеспечивает работу с ESM-бандлерами (например, Vite).
Улучшенная поддержка TypeScript
Nuxt 4 идет дальше в интеграции TypeScript. Теперь большинство внутренних типов открыты и поддерживаются декларативно. TypeScript-конфигурация идет из коробки и не требует дополнительных настроек.
Пример файла конфигурации на TypeScript:
// nuxt.config.ts — нативная TS поддержка
export default defineNuxtConfig({
devtools: true
})
// Теперь вы получаете автокомплит и проверку типов для всех ключей конфига.
Модульность и импорт on-demand
Nuxt 4 предпочитает возможность подгрузки функций по мере необходимости, а не глобально. Теперь вы можете подключить только те API и модули, которые будут реально использоваться.
Пример:
// Импортируем только необходимые функции во Vue компонентах
import { useFetch } from '#app'
const { data } = await useFetch('/api/user')
// Здесь мы только подключили useFetch, другие composables не загружаются
Роутинг и структура проекта
Файловый роутинг с поддержкой динамических маршрутов
Nuxt 4 сохраняет принцип файлового роутинга из прошлых версий, но реализует его через новые механизмы с поддержкой Vite, что ускоряет старт разработки.
Пример структуры
pages/
index.vue // Главная
about.vue // /about
blog/
[slug].vue // /blog/:slug
Пример динамического маршрута:
<script setup>
// Файл pages/blog/[slug].vue
const route = useRoute()
const { data } = await useFetch(`/api/post/${route.params.slug}`)
// Загружаем пост по динамическому slug
</script>
Теперь файлы именуются с квадратными скобками для динамики ([slug].vue
).
Если вы только начинаете свой путь в мире Nuxt, или хотите глубже разобраться в его архитектуре и возможностях, понимание ключевых концепций и изменений в Nuxt 4 становится критически важным. Это фундамент, на котором строится разработка современных fullstack Vue приложений. Если вы хотите детальнее погрузиться в мир Nuxt, освоить все его тонкости и стать настоящим профессионалом — приходите на наш большой курс Nuxt - fullstack Vue фреймворк. На курсе 129 уроков и 13 упражнений, AI-тренажеры для безлимитной практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.
Лэйауты и middleware
Лэйауты и middleware реализованы декларативно, с поддержкой автоматического импорта соответствующих функций.
Использование layout:
<script setup>
definePageMeta({ layout: 'custom-layout' }) // Назначаем макет для этой страницы
</script>
SSR, SSG и новые возможности Hybrid Rendering
Полная поддержка SSR и SSG из коробки
Nuxt 4 делает акцент на гибридное рендеринг: вы можете разрабатывать части сайта как SSR (серверный рендеринг), а другие — как SSG (генерируемые статически).
Пример генерации статических страниц:
// nuxt.config.mjs
export default defineNuxtConfig({
nitro: {
preset: "vercel" // Можно деплоить сразу в облака
},
generate: {
routes: ['/posts/1', '/posts/2']
}
})
Сейчас для generation используется движок Nitro, который эффективнее старого builder и дает возможность деплоить проект даже на edge-functions.
On-demand Server API (Nitro)
SSR теперь базируется на движке Nitro — он позволяет создавать собственные endpoints прямо внутри Nuxt проекта.
Как это выглядит:
server/
api/
hello.get.ts
// server/api/hello.get.ts
export default defineEventHandler(() => {
return { message: 'Привет из вашего эндпоинта!' }
})
// Этот код отвечает на GET-запросы по /api/hello
Гибкая система middlewares и server handlers
Middlewares могут быть как клиентскими (vue роутер), так и серверными (/server/middleware
), что упрощает контроль над потоком запросов.
Пример server middleware:
// server/middleware/auth.ts
export default defineEventHandler((event) => {
// Здесь можно реализовать проверку токена и отдавать 401 при ошибке
const token = event.headers['authorization']
if (!token) throw createError({ statusCode: 401, statusMessage: 'Unauthorized' })
})
Новый подход к state management
Интернализация Pinia
Pinia стал стандартом для работы с состоянием во всех новых Nuxt-проектах. Vuex официально не поддерживается.
Пример store на Pinia:
// stores/useUserStore.ts
import { defineStore } from 'pinia'
export const useUserStore = defineStore('user', {
state: () => ({
name: '',
loggedIn: false
}),
actions: {
login(name: string) {
this.name = name
this.loggedIn = true
}
}
})
И используем в компоненте: ```js import { useUserStore } from '~/stores/useUserStore'
const userStore = useUserStore() // userStore.login('Alex') // Теперь данные пользователя доступны во всех компонентах проекта </script> ```
Данные Pinia автоматически сериализуются и гидратируются между сервером и клиентом.
Новые преимущества интерактивности: useAsyncData, useFetch
Единство подхода к асинхронным данным
В Nuxt 4 асинхронная загрузка — базовая возможность через composables.
Пример useFetch:
<script setup>
const { data, pending, error } = await useFetch('/api/items')
// pending и error упростят отображение лоадеров и ошибок
</script>
Пример useAsyncData:
<script setup>
const { data, refresh } = await useAsyncData('items', () =>
$fetch('/api/items')
)
// refresh — встроенное обновление данных без перезагрузки страницы
</script>
Основное отличие: useAsyncData
позволяет создать именованный источник данных и повторно использовать его, а useFetch
автоматически связывает загрузку с рендерингом компонента.
Новая система автоимпорта и модульность
Автоматические импорты composables, компонентов и утилит
Больше не нужно ручных импортов — все компоненты и util-функции из папки composables/
, components/
или utils/
подключаются автоматически.
Пример:
composables/
useColorMode.ts
// можно просто использовать useColorMode в любом компоненте без импортов
<script setup>
const { mode, setMode } = useColorMode() // Работает сразу, если файл есть
</script>
Улучшенный DX (Developer eXperience)
Nuxt 4 глубже интегрирован с VSCode и WebStorm, автокомплиты и рефакторинг для динамических импортов, slug-роутов и стор.
Обновленная система плагинов
Плагины теперь регистрируются через папку /plugins
, поддержка TypeScript и ESM.
Пример:
// plugins/hello.ts
ts
export default defineNuxtPlugin(nuxtApp => {
nuxtApp.provide('hello', () => 'Hello Nuxt 4!')
})
Использование в компоненте:
js
<script setup>
const { $hello } = useNuxtApp()
console.log($hello()) // Выведет 'Hello Nuxt 4!'
</script>
Миграция с Nuxt 2 или 3 на Nuxt 4
Основные шаги и советы
- Обновите свои зависимости — приведите все ключевые пакеты (
nuxt
,@nuxt/*
,pinia
,vite
и т.д.) к последним версиям. - Переименуйте файл конфигурации на
nuxt.config.mjs
(илиnuxt.config.ts
). - Проверьте плагины и middleware — перепишите их с учетом нового синтаксиса (ESM, TypeScript).
- Перенесите сторы на Pinia — Vuex не поддерживается.
- Используйте новые composables — замените устаревшие функции на новые аналоги (
useAsyncData
,useFetch
и др.). - Проверьте статические и динамические страницы — используйте правильное именование файлов для динамики, обновите серверные эндпоинты.
Дополнительные возможности и улучшения
Vite как основной бандлер
В Nuxt 4 Vite стал основным инструментом сборки, что увеличило скорость старта и перезапуска серверов, ускорило hot-reload.
Edge rendering и автоматический деплой
Механизмы Nitro позволяют запускать Nuxt проекты на edge-функциях популярных платформ (Vercel, Netlify), что дает минимальные задержки для пользователей по всему миру.
Расширяемость через модули
Nuxt 4 сохранил философию "модульной" архитектуры, но еще упростил создание и подключение как сторонних, так и собственных модулей.
Заключение
Nuxt 4 — это качественный эволюционный шаг для разработки современных приложений на Vue. Он сосредотачивается на скорости, гибкости и простоте — теперь создание Full-Stack решений возможно практически без лишней конфигурации, напрямую используя современные API и инструменты. Благодаря переходу на ES-модули, новой системе SSR и Nitro, глубокому внедрению TypeScript и Pinia, Nuxt 4 становится отличной базой как для MVP-продуктов, так и для масштабных веб-приложений корпоративного уровня.
Ознакомившись с ключевыми изменениями и примерами, вы сможете быстро начать использовать новые возможности Nuxt 4 уже в ближайших своих проектах.
Владение Nuxt открывает двери к созданию сложных, масштабируемых веб-приложений. Однако, знание теории без практики может оказаться недостаточным. Чтобы закрепить полученные знания и научиться применять их на реальных проектах, необходима практика. На курсе Nuxt - fullstack Vue фреймворк вы сможете пройти через все этапы создания современного веб-приложения, от настройки окружения до деплоя на сервер. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в мир Nuxt прямо сегодня.
Частозадаваемые технические вопросы по теме и ответы на них
Как правильно реализовать собственный серверный endpoint в Nuxt 4?
Создайте файл в папке server/api/
, например, server/api/status.get.ts
. Экспортируйте функцию обработчика:
export default defineEventHandler((event) => {
return { status: 'ok' }
})
// Теперь GET-запрос к /api/status вернет {status: 'ok'}
Как внедрить сторонний модуль, если он пока не обновлен под Nuxt 4?
Часто поможет форк или временно использование его кода через папку modules/
собственного проекта. Проверьте, что модуль совместим с ESM и обновите егоImports под Nuxt 4. Для некоторых пакетов потребуется переписать плагины и проверить пути резолвинга.
Мой layout не применяется — что делать?
Проверьте, что layout определен в папке layouts/
и имеет правильное имя файла (например, my-layout.vue
). На странице используйте definePageMeta({ layout: 'my-layout' })
.
SSR отключен, страница не рендерится на сервере?
Проверьте, что в конфиге установлен ssr: true
и нет ошибок в server-side коде. Также удостоверьтесь, что endpoints не зависят от browser-only API.
Как плавно перейти со Vuex на Pinia при большом проекте?
Добавьте Pinia через модуль, создавайте новые store через defineStore
, постепенно переписывайте существующие хранилища. Можно временно держать Vuex и Pinia в одном проекте, пока переход не будет завершен.
Постройте личный план изучения Nuxt до уровня Middle — бесплатно!
Nuxt — часть карты развития Frontend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Nuxt
Лучшие курсы по теме

Nuxt
Антон Ларичев
TypeScript с нуля
Антон Ларичев