РекомендуетсяNuxt 4Vue

Nuxt: структура app/server и правила регистрации

Разделяйте приложение Vue, Nitro server и общий код по правилам версии Nuxt. Файловый маршрут, middleware и auto-import должны иметь понятную область; generated-файлы не являются местом ручной правки.

Опубликовано Проверено Изменено

Плохо

Для Nuxt 4 скопирована структура Nuxt 2 с asyncData и старым runtime config.
Из app/composables импортируется server/db.
Секрет находится в runtimeConfig.public.
API защищено только клиентским route middleware.

Хорошо

Nuxt 4, стандартный srcDir:
app/app.vue                       оболочка с NuxtPage при использовании pages
app/pages/orders/[id].vue          страница /orders/:id
app/components/OrderCard.vue       компонент
app/composables/useOrders.ts       composable приложения
server/api/orders/[id].get.ts      GET /api/orders/:id, серверная авторизация
server/utils/orders.ts            серверная работа с данными
shared/types/order.ts             тип без runtime-зависимости от Vue/сервера
nuxt.config.ts                    конфигурация; private runtimeConfig отдельно
.nuxt/ и .output/                  генерируются, вручную не редактируются

Почему это важно

Nuxt создает маршруты и imports из структуры каталогов. Файл в неверной области может отсутствовать в приложении либо попасть в клиентскую сборку. Middleware навигации не заменяет проверку прямого вызова API.

Когда применять

Nuxt 4.x. Пример использует стандартную структуру app; srcDir, layers и настройки auto-import могут менять пути. Зафиксируйте их в проекте. pages опционален: для одностраничной оболочки не создавайте пустые каталоги ради схемы.

Файлы pages дают маршруты UI, server/api — API с префиксом /api, server/routes — серверные маршруты без него. Суффикс .get/.post ограничивает HTTP-метод. Клиентский route middleware относится к навигации; сервер проверяет сессию/право при каждом чувствительном запросе.

app-композаблы используют Nuxt/Vue context; не импортируйте их в Nitro. shared содержит только подходящие обеим сторонам зависимости, не доступ к БД и не request state. Не считайте auto-import разрешением вызывать composable вне нужного lifecycle/context.

runtimeConfig.public включается в клиентский payload; секреты остаются в private части и читаются сервером. app.config также не место секретов. Проверяйте runtime environment отдельно от build environment. Новые имена компонентов/composables согласуйте с Vue-профилем, не маскируйте конфликт имени чужого auto-import.

Кто что делает

Человек

Утверждает web/server границу, конфигурацию layers и доступные маршруты.

AI-агент

Проверяет фактическую major-версию и auto-import, не редактирует generated output и проверяет серверный API напрямую.

Как проверить у себя

Вход и действиеОжидаемый результатСвидетельство
Созданы page и GET APIОба маршрута обнаружены, другой HTTP-метод обрабатывается по контрактуProduction build и HTTP
Прямой вызов API без прохождения UI middlewareСервер самостоятельно запрещает закрытую операциюОтрицательный HTTP-тест
Секрет добавлен в runtimeConfig.public/shared importПроверка выявляет утечку в payload/bundleПоиск тестового маркера
Чистая сборка без старого .nuxtВсе типы/imports восстанавливаются штатноBuild из чистой копии

Перенос каталога из Nuxt 2/3 требует отдельной проверки миграции, а не механической замены имени.

ПервоисточникиИстория изменений на GitHub

Дата проверки отражает содержательную сверку. Синхронизация сайта не обновляет её автоматически.