логотип PurpleSchool
логотип PurpleSchool

Что такое 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

Основные шаги и советы

  1. Обновите свои зависимости — приведите все ключевые пакеты (nuxt, @nuxt/*, pinia, vite и т.д.) к последним версиям.
  2. Переименуйте файл конфигурации на nuxt.config.mjs (или nuxt.config.ts).
  3. Проверьте плагины и middleware — перепишите их с учетом нового синтаксиса (ESM, TypeScript).
  4. Перенесите сторы на Pinia — Vuex не поддерживается.
  5. Используйте новые composables — замените устаревшие функции на новые аналоги (useAsyncData, useFetch и др.).
  6. Проверьте статические и динамические страницы — используйте правильное именование файлов для динамики, обновите серверные эндпоинты.

Дополнительные возможности и улучшения

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 в одном проекте, пока переход не будет завершен.

Стрелочка влевоКак настроить config в NuxtИнструкция по миграции с Nuxt 3 на Nuxt 4Стрелочка вправо

Постройте личный план изучения Nuxt до уровня Middle — бесплатно!

Nuxt — часть карты развития Frontend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по Nuxt

Генерация статического сайта с помощью NuxtКак использовать useAsyncData в NuxtКак использовать SVG в NuxtКоманды для запуска NuxtРабота с JSON-данными в NuxtКак настроить HTML-шаблон в NuxtГенерация статического сайта с помощью NuxtРуководство по получению данных с Fetch в NuxtКак отключить определенные функции в NuxtРабота с данными в Nuxt с помощью useNuxtDataНастройка и использование cookie в NuxtГайд по аутентификации (auth) в NuxtКак создавать API-маршруты в Nuxt
Использование Vite для ускорения разработки в NuxtРуководство по использованию TypeScript в NuxtКак запустить Nuxt-приложение в productionКак работает Server-Side Rendering SSR в NuxtНастройка и оптимизация серверной части Nuxt-приложенияРуководство по настройке маршрутизации в NuxtКакие проекты разумно реализовывать на NuxtИнструкция по управлению пакетами NPM в NuxtИнтеграция Node.js для Nuxt-приложенияНастройка мета-тегов для SEO в NuxtНастройка и использование HTTPS в NuxtКак отлавливать и обрабатывать ошибки в NuxtКак развернуть Nuxt приложение в DockerРуководство по развертыванию приложений в Nuxt CloudКак оптимизировать сборку на NuxtИнтеграция Laravel и Nuxt
Открыть базу знаний

Лучшие курсы по теме

Иконка ракетыСкоро!
изображение курса

Nuxt

Антон Ларичев
изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий