Навигация

Деплой Nuxt: Nitro, presets и routeRules

Nuxt 3 решает деплой через Nitro — универсальный серверный движок, который знает, как собрать приложение для Node.js, Vercel, Cloudflare Workers, Netlify и других сред. Одним Nitro preset вы меняете целевую платформу без изменения кода. Статья разбирает разницу между nuxt build и nuxt generate, работу routeRules, edge-деплой и управление переменными окружения через runtimeConfig.

Содержание

  1. Что такое Nitro
  2. nuxt build vs nuxt generate
  3. SSR-деплой
  4. SSG и Prerender
  5. ISR через routeRules
  6. Edge-пресеты
  7. Runtime config и environment variables
  8. Server routes и API
  9. Деплой на популярные платформы
  10. Image optimization
  11. Чеклист перед деплоем
  12. Ключевые тезисы для интервью
  13. Заключение

Что такое Nitro

Nuxt 3 построен поверх Nitro — универсального серверного движка. Nitro отвечает за:

  • Рендеринг страниц на сервере.
  • Генерацию статических файлов.
  • Подготовку serverless-функций для разных платформ.
  • Работу с server routes в server/api/.
  • Edge-деплой на CDN-узлы.
┌─────────────────────────────────────────────────────────────┐
│                         Nuxt 3                               │
├─────────────────────────────────────────────────────────────┤
│                         Nitro                                │
├─────────────────┬─────────────────┬─────────────────────────┤
│   SSR / SSG     │  Server Routes  │    Edge Presets         │
│   рендеринг     │  server/api/    │    Cloudflare, Vercel   │
└─────────────────┴─────────────────┴─────────────────────────┘

Nitro позволяет одной командой собрать приложение для Node.js, Cloudflare Workers, Vercel, Netlify, Deno Deploy и многих других сред.


nuxt build vs nuxt generate

КомандаЧто делаетТребует серверПодходит для
nuxt buildСобирает SSR/ISR приложениеДаFull-stack приложения
nuxt generateГенерирует статические HTMLНетБлоги, лендинги, документация

nuxt build

nuxt build

Создаёт папку .output/ с:

  • public/ — статические файлы.
  • server/ — серверный код.
  • nitro.json — манифест Nitro.

Запуск production:

node .output/server/index.mjs

nuxt generate

nuxt generate

Создаёт папку .output/public/ со статическими файлами. Можно загрузить на любой статический хостинг.

Гибридный режим

// nuxt.config.ts
export default defineNuxtConfig({
  routeRules: {
    '/': { prerender: true },
    '/blog/**': { prerender: true },
    '/dashboard/**': { ssr: false },
    '/api/**': { cors: true },
  },
})

SSR-деплой

Базовая конфигурация

// nuxt.config.ts
export default defineNuxtConfig({
  ssr: true, // По умолчанию
})

Что происходит при сборке

┌─────────────┐      ┌─────────────────┐      ┌─────────────────┐
│ nuxt build  │ ───► │  Nitro готовит  │ ───► │  .output/       │
│             │      │  SSR-сервер     │      │  server/index.mjs│
└─────────────┘      └─────────────────┘      └─────────────────┘

Запуск в production

node .output/server/index.mjs

Docker

FROM node:20-alpine
WORKDIR /app

COPY package.json package-lock.json ./
RUN npm ci

COPY . .
RUN npm run build

ENV NUXT_HOST=0.0.0.0
ENV NUXT_PORT=3000

EXPOSE 3000

CMD ["node", ".output/server/index.mjs"]

Presets для SSR

Nitro автоматически определяет preset по окружению, но можно задать явно:

// nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    preset: 'node-server', // По умолчанию для self-hosted
  },
})

SSG и Prerender

Базовые режимы рендеринга (SSR, SSG, CSR, ISR) подробнее разобраны в Режимы рендеринга. Здесь — deployment-аспекты.

Глобальная генерация

nuxt generate

Частичный prerender

// nuxt.config.ts
export default defineNuxtConfig({
  routeRules: {
    '/': { prerender: true },
    '/about': { prerender: true },
    '/blog/**': { prerender: true },
  },
})

Динамические маршруты

Для динамических маршрутов нужно указать prerender и задать параметры:

<!-- pages/blog/[slug].vue -->
<script setup>
const route = useRoute()
const { data: post } = await useFetch(`/api/posts/${route.params.slug}`)
</script>
// nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    prerender: {
      routes: ['/blog/first-post', '/blog/second-post'],
    },
  },
})

Или через useAsyncData с prerender

// server/api/posts.get.ts
export default defineEventHandler(() => {
  return [
    { slug: 'first-post', title: 'First Post' },
    { slug: 'second-post', title: 'Second Post' },
  ]
})
// nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    prerender: {
      routes: ['/'],
    },
  },
})

ISR через routeRules

Подробнее про ISR и другие режимы см. Режимы рендеринга. Здесь — настройка под деплой.

Nuxt 3 поддерживает ISR через routeRules в nuxt.config.ts.

// nuxt.config.ts
export default defineNuxtConfig({
  routeRules: {
    '/blog/**': { isr: 60 },
    '/products/**': { isr: 300 },
  },
})

On-Demand Revalidation

// server/api/revalidate.post.ts
export default defineEventHandler(async (event) => {
  const body = await readBody(event)

  await $fetch(`/api/__nuft__/isr?path=${body.path}`, {
    method: 'POST',
    baseURL: useRuntimeConfig().public.siteUrl,
  })

  return { revalidated: true }
})

ISR в Nuxt реализован через Nitro и зависит от preset. На Vercel и Netlify работает из коробки, на self-hosted требует настройки хранилища.


Edge-пресеты

Nitro умеет собирать приложение для Edge Runtime.

Cloudflare Workers

// nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    preset: 'cloudflare-pages',
  },
})
nuxt build
# Папка dist/ готова для Cloudflare Pages

Vercel Edge

// nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    preset: 'vercel-edge',
  },
})

Netlify Edge

// nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    preset: 'netlify-edge',
  },
})

Популярные presets

PresetПлатформа
node-serverSelf-hosted, Docker, Railway
vercelVercel (SSR)
vercel-edgeVercel Edge Functions
netlifyNetlify (SSR)
netlify-edgeNetlify Edge Functions
cloudflare-pagesCloudflare Pages
cloudflare-moduleCloudflare Workers
deno-deployDeno Deploy

Runtime config и environment variables

runtimeConfig

// nuxt.config.ts
export default defineNuxtConfig({
  runtimeConfig: {
    apiSecret: '', // Серверная часть
    public: {
      apiBase: '/api', // Доступно на клиенте
    },
  },
})

Переменные окружения

# .env
NUXT_API_SECRET=secret-key
NUXT_PUBLIC_API_BASE=https://api.example.com

Nuxt автоматически маппит NUXT_* переменные в runtimeConfig.

Использование в коде

<script setup>
const config = useRuntimeConfig()

// На сервере
console.log(config.apiSecret)

// На клиенте
console.log(config.public.apiBase)
</script>

Важно

  • runtimeConfig.public доступен и на клиенте, и на сервере.
  • runtimeConfig без public — только на сервере.
  • В отличие от NEXT_PUBLIC_, здесь переменные можно менять без пересборки, если preset это поддерживает.

Server routes и API

Server routes в Nuxt — это обработчики на базе h3, которые компилируются Nitro.

// server/api/users.get.ts
export default defineEventHandler(() => {
  return [
    { id: 1, name: 'Alice' },
    { id: 2, name: 'Bob' },
  ]
})
// server/api/users.post.ts
export default defineEventHandler(async (event) => {
  const body = await readBody(event)

  if (!body.name) {
    throw createError({
      statusCode: 400,
      statusMessage: 'Name is required',
    })
  }

  return { id: 1, name: body.name }
})

Middleware на сервере

// server/middleware/auth.ts
export default defineEventHandler((event) => {
  const token = getHeader(event, 'authorization')

  if (!token) {
    throw createError({ statusCode: 401 })
  }
})

Что работает в server routes

  • Работа с БД.
  • Вызов внешних API.
  • Чтение/запись файлов (в Node.js preset).
  • Edge-compatible код (для edge presets).

Деплой на популярные платформы

Vercel

  1. Импортировать репозиторий.
  2. Vercel автоматически определяет Nuxt.
  3. Настроить environment variables.
  4. Деплой.
npx nuxi@latest init my-app
npx vercel

Netlify

npx netlify-cli deploy --build --prod

Или через UI: задать Build command npm run build и Publish directory dist.

Railway

railway login
railway init
railway up

Railway автоматически определит Node.js приложение и запустит npm start.

Cloudflare Pages

npx nuxi build --preset cloudflare-pages

Затем загрузить папку dist/ в Cloudflare Pages.

Self-hosted VPS

nuxt build
node .output/server/index.mjs

Рекомендуется использовать процесс-менеджер:

npm install -g pm2
pm2 start .output/server/index.mjs --name nuxt-app

Image optimization

Nuxt Image

npm install @nuxt/image
// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxt/image'],
  image: {
    provider: 'ipx', // По умолчанию для self-hosted
  },
})
<template>
  <NuxtImg src="/photo.jpg" width="800" height="600" />
</template>

Провайдеры

ПровайдерКогда использовать
ipxSelf-hosted, Docker
cloudflareCloudflare Pages
cloudinaryCloudinary
imgixImgix
vercelVercel

Static export

При nuxt generate изображения оптимизируются на этапе сборки.


Чеклист перед деплоем

  • nuxt build проходит локально без ошибок.
  • nuxt generate протестирован, если используется SSG.
  • Все environment variables добавлены в runtimeConfig.
  • Server routes валидируют входные данные.
  • ISR настроен и протестирован.
  • Выбран правильный Nitro preset.
  • site.url настроен для SEO и метаданных.
  • Image provider соответствует платформе.
  • Добавлен health check.
  • Есть план отката.

Ключевые тезисы для интервью

  • Nitro — универсальный серверный движок Nuxt 3: он собирает приложение для любой платформы, меняя только preset.
  • nuxt build создаёт SSR-приложение в .output/; nuxt generate — статические HTML в .output/public/.
  • routeRules — центральное место для управления SSG/SSR/ISR на уровне маршрутов без изменения компонентов.
  • isr: 60 в routeRules включает ISR с периодом ревалидации 60 секунд для указанных маршрутов.
  • Edge-пресеты (cloudflare-pages, vercel-edge, netlify-edge) собирают приложение для CDN-узлов без холодного старта.
  • runtimeConfig — правильный способ работы с переменными окружения в Nuxt 3; NUXT_* переменные маппятся автоматически.
  • runtimeConfig.public доступен на клиенте и сервере; runtimeConfig без public — только на сервере.
  • Для self-hosted деплоя используйте node-server preset и PM2 или Docker с .output/server/index.mjs.

Заключение

Nuxt 3 благодаря Nitro предлагает очень гибкий деплой: от статического экспорта до Edge Runtime.

Ключевые выводы:

  1. nuxt build — для SSR/ISR, требует сервер.
  2. nuxt generate — для чистого SSG, можно хостить где угодно.
  3. routeRules — центральное место для управления SSG/SSR/ISR.
  4. Nitro preset определяет, куда можно задеплоить приложение.
  5. runtimeConfig — правильный способ работы с переменными окружения.
  6. Edge-presets работают на Cloudflare, Vercel, Netlify.
  7. @nuxt/image упрощает оптимизацию изображений, но требует настройки провайдера.

На собеседовании важно понимать разницу между nuxt build и nuxt generate, уметь настраивать routeRules и объяснять, зачем нужен Nitro.