Урок 01

Введение в Nuxt

Что такое Nuxt

Nuxt — фреймворк поверх Vue. Даёт:

  • SSR — рендер на сервере
  • SSG — статические сайты
  • Файловый роутинг
  • Auto-imports
  • SEO из коробки

Аналогия: Nuxt для Vue = Next.js для React.

Зачем Nuxt

Проблемы обычного Vue SPA:

  • Плохое SEO
  • Медленный первый рендер
  • Нет серверной логики

Nuxt решает всё это.

Режимы рендеринга

  • SSR — рендер на сервере (динамика, SEO)
  • SSG — статика при сборке (блог, доки)
  • SPA — только клиент (админки)
  • ISR — инкрементальная регенерация

Установка

npx nuxi@latest init my-app
cd my-app
npm install
npm run dev

nuxi — CLI Nuxt.

Структура проекта

my-app/
├── app.vue              # корневой компонент
├── pages/               # страницы (роутинг)
├── components/          # компоненты (auto-import)
├── composables/         # composables (auto-import)
├── layouts/             # лейауты
├── middleware/          # middleware
├── plugins/             # плагины
├── server/              # API-роуты
├── public/              # статика
├── assets/              # ресурсы
├── nuxt.config.ts       # конфиг
└── package.json

app.vue

Корневой компонент:

<template>
    <div>
        <NuxtLayout>
            <NuxtPage />
        </NuxtLayout>
    </div>
</template>

<NuxtPage> — рендер текущей страницы из pages/.

<NuxtLayout> — лейаут.

pages/index.vue

<template>
    <div>
        <h1>Главная</h1>
        <p>Добро пожаловать в Nuxt!</p>
    </div>
</template>

Файл автоматически становится роутом /.

Auto-imports

Не нужно импортировать:

  • ref, computed, watch
  • Компоненты из components/
  • Composables из composables/
  • useRoute, useRouter, useFetch
<script setup lang="ts">
// Не нужно: import { ref } from 'vue'
const count = ref(0);

// Не нужно: import { useMyButton } ...
</script>

<template>
    <MyButton />
    <p>{{ count }}</p>
</template>

Отличия от Vue

VueNuxt
РоутингVue RouterФайловый
Data fetchfetch/axiosuseFetch/useAsyncData
SSRНастройкаИз коробки
Auto-importНетДа
LayoutsВручнуюВстроено

nuxt.config.ts

export default defineNuxtConfig({
    devtools: { enabled: true },
    modules: ['@nuxtjs/tailwindcss'],
    runtimeConfig: {
        apiSecret: '',    // только сервер
        public: {
            apiBase: 'https://api.example.com',
        },
    },
    app: {
        head: {
            title: 'My App',
            meta: [
                { name: 'description', content: 'Description' },
            ],
        },
    },
});

Script setup

Тот же синтаксис, что в Vue 3:

<script setup lang="ts">
const count = ref(0);
const doubled = computed(() => count.value * 2);

function increment() {
    count.value++;
}
</script>

<template>
    <button @click="increment">
        {{ count }} — {{ doubled }}
    </button>
</template>

Команды

npx nuxi dev           # dev-сервер
npx nuxi build         # сборка
npx nuxi generate      # SSG
npx nuxi preview       # превью прода
npx nuxi typecheck     # проверка типов

Что дальше

  1. Файловый роутинг
  2. Динамические маршруты
  3. Layouts
  4. Middleware
  5. Компоненты и auto-imports
  6. Состояние
  7. Server Routes
  8. Метаданные и SEO
  9. Конфигурация

Итог

  • Nuxt — фреймворк для Vue
  • SSR/SSG/SPA/ISR — режимы
  • Файловый роутинг
  • Auto-imports
  • SEO из коробки

Дальше — файловый роутинг.