Авто-импорт компонентов и функций

В Nuxt вы не пишете import для своих компонентов и composables — фреймворк подключает их сам по имени файла.
Суть: Nuxt сканирует папки components/, composables/ и utils/ и делает их содержимое доступным глобально без ручных импортов. Имя компонента выводится из пути файла. Это сокращает шаблонный код, но требует понимания правил именования.

В чистом Vue верх каждого файла забит импортами: компоненты, composables, утилиты. В Nuxt этого почти нет — и это одна из самых приятных его особенностей. Всё, что лежит в components/, composables/ и utils/, авто-импортируется. Плюс к этому Nuxt авто-импортирует реактивные API Vue (ref, computed, watch) и собственные композаблы (useFetch, useRoute, useState).

Для компонентов имя выводится из пути. components/TheHeader.vue доступен как <TheHeader />. Вложенность кодируется в имени: components/blog/PostCard.vue становится <BlogPostCard /> — путь схлопывается в PascalCase-имя. Это устраняет коллизии имён между разными папками.

   Файл                              Имя в шаблоне

   components/TheHeader.vue       -> <TheHeader />
   components/blog/PostCard.vue   -> <BlogPostCard />
   components/ui/BaseButton.vue   -> <UiBaseButton />
   composables/useCart.ts         -> useCart()

Для composables и утилит работает то же: экспортированная функция становится доступна по имени без импорта. Вы пишете const cart = useCart() — и Nuxt сам найдёт composables/useCart.ts.

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

При старте Nuxt строит реестр: проходит по папкам, собирает все экспортируемые компоненты и функции и генерирует виртуальные модули с импортами в .nuxt/. Сборщик (Vite) при компиляции подставляет нужные импорты автоматически — то есть авто-импорт не «магия рантайма», а аккуратная подстановка на этапе сборки. В бандл попадает только то, что реально используется (tree-shaking), поэтому авто-импорт не раздувает результат.

Смоделируем разрешение имени компонента из пути файла — именно эту нормализацию делает Nuxt:

// Как Nuxt превращает путь файла в имя компонента.
function componentName(path) {
  return path
    .replace(/^components\//, "")   // убрать префикс
    .replace(/\.vue$/, "")          // убрать расширение
    .split("/")                     // разбить по папкам
    .map(seg => seg.charAt(0).toUpperCase() + seg.slice(1)) // PascalCase
    .join("");                      // склеить
}

const files = [
  "components/TheHeader.vue",
  "components/blog/PostCard.vue",
  "components/ui/BaseButton.vue",
];

for (const f of files) {
  console.log(f.padEnd(34), "-> <" + componentName(f) + " />");
}

Попробуй сам ▶ — путь схлопывается в одно PascalCase-имя. Зная это правило, вы всегда предскажете имя компонента.

Частые ошибки

  • Удивляться имени с префиксом папки. components/ui/BaseButton.vue — это <UiBaseButton />, а не <BaseButton />.
  • Импортировать вручную «на всякий случай». Дублирующий импорт не нужен и иногда конфликтует с авто-импортом.
  • Ждать авто-импорт из произвольной папки. Сканируются только условленные директории; для своих папок настройте их в конфиге.

Best practices

  • Именуйте компоненты так, чтобы итоговое имя читалось: префиксы The, Base, App — общепринятые.
  • Группируйте по подпапкам — префикс из имени папки заодно избавит от коллизий.
  • Не борйтесь с авто-импортом ручными импортами; доверьтесь соглашению.

Итог: авто-импорт убирает гору шаблонного кода и делает Nuxt-проекты чище. Главное — понимать, как имя выводится из пути. Дальше — как компоненты обмениваются данными через props и события.

Важно понимать границу авто-импортов: они охватывают ваш код в условленных папках и встроенные API Nuxt и Vue, но не сторонние npm-пакеты. Импорт из lodash или клиента базы данных вы по-прежнему пишете явно. Это разумный компромисс: магия применяется там, где она предсказуема (ваши файлы по соглашениям), и не применяется там, где была бы непрозрачной (внешние зависимости). При желании набор авто-импортируемых функций и папок настраивается в nuxt.config — например, можно подключить утилиты из своей библиотеки, чтобы они тоже были доступны без импортов.

Проверьте себя
1. Как будет называться в шаблоне компонент из файла components/blog/PostCard.vue?
A<PostCard />
B<BlogPostCard />
C<blog-PostCard />
D<Blog/PostCard />
2. Когда происходит подстановка авто-импортов в Nuxt?
AВ рантайме при каждом рендере
BНа этапе сборки: Nuxt генерирует импорты, а сборщик подставляет только используемое
CНикогда — это просто глобальные переменные
DТолько при включённом SSR