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

Как использовать шаблоны Templates в Nuxt

Автор

Олег Марков

Введение

Nuxt значительно упрощает разработку современных Vue-приложений — одна из его сильных сторон заключается в гибких возможностях шаблонизации. Шаблоны (templates) в Nuxt — это не только уже встроенные механизмы формирования страниц, но и инструмент, с помощью которого вы можете расширять проект, автоматизировать работу и добавлять кастомный функционал. В этой статье мы подробно разберём, где используются шаблоны в Nuxt, как с ними работать, какие бывают сценарии использования, а также приведём практические примеры, чтобы вы могли быстро и эффективно применять шаблоны в своих проектах.

Зачем нужны шаблоны в Nuxt?

Шаблоны в Nuxt отвечают за автоматическую генерацию содержимого — например, отдельных файлов при сборке, HTML-шеллов страниц, мета-тегов, настроек конфигурации и даже серверных обработчиков. Другими словами, это участки кода, которые могут автоматически дополняться, изменяться или полностью создаваться в момент сборки или запуска приложения.

Смотрите, почему именно с помощью шаблонов можно:

  • Автоматически генерировать файлы, которые до этого приходилось создавать вручную
  • Использовать переменные окружения или данные из nuxt.config при формировании итогового файла или страницы
  • Кастомизировать базовые файлы (например, app.html, error.vue) под ваши нужды
  • Использовать шаблоны плагинов для подключения сторонних решений или обёрток над функционалом

Теперь давайте посмотрим подробнее, как это реализовано в Nuxt.

Шаблоны - это основа для создания пользовательского интерфейса в Nuxt-приложениях. Но для создания действительно красивых и функциональных шаблонов необходимо понимать, как работает синтаксис Vue, как использовать компоненты и как интегрировать шаблоны с другими частями вашего приложения. Если вы хотите узнать больше о том, как использовать шаблоны в Nuxt, приходите на наш большой курс Nuxt - fullstack Vue фреймворк. На курсе 129 уроков и 13 упражнений, AI-тренажеры для безлимитной практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.

Основные типы шаблонов в Nuxt

Nuxt использует несколько направлений шаблонизации. Рассмотрим основные варианты:

1. Генерация файлов на лету: директория templates

Внутри директорий ваших модулей, а порой и в корне проекта (например, если вы делаете собственный шаблонный проект) можно разместить папку templates. Всё, что лежит внутри, будет обработано Nuxt во время сборки, а в результирующую папку .nuxt попадут сгенерированные файлы с подставленными переменными.

Как работает templates в Nuxt?

Nuxt копирует файлы-исходники из папки templates, заменяя в них специальные маркеры переменными, которые вы укажете. Например, вы можете создать шаблонный файл с подстановками:

// templates/custom-inject.js
export default () => {
  // Используем специальные маркеры <% %> для шаблонных переменных
  return `<template>
    <div>Hello from <%= name %> template!</div>
  </template>`
}

При этом при добавлении этого шаблона в модуль или при расширении сборки Nuxt вы можете передать объект с данными для этих переменных:

// nuxt.config.js или модуль
export default defineNuxtConfig({
  hooks: {
    'nitro:config'(nitroConf) {
      nitroConf.templates = [
        {
          src: './templates/custom-inject.js', // Путь к шаблону
          dst: 'custom-inject.js', // Куда сохранять файл в .nuxt/
          options: { name: 'MyAwesome' }
        }
      ]
    }
  }
})

Nuxt самостоятельно просканирует файл, заменит <%= name %> на MyAwesome, и положит полученный результат в .nuxt/custom-inject.js.

Использование шаблонов в модулях

Частый кейс — вы делаете Nuxt-модуль, и хотите, чтобы он генерировал динамические файлы (например, плагины с вашим кодом). Давайте разберем процесс на практике.

  1. В модуле создайте templates/my-plugin.js:
// templates/my-plugin.js
export default defineNuxtPlugin(nuxt => {
  // <% pluginMessage %> будет заменён на содержимое из опций
  console.log('<%= pluginMessage %>')
})
  1. При подключении модуля укажите генерацию шаблона:
// Внутри setup() вашего Nuxt-модуля
nuxt.options.build.templates.push({
  src: resolve(__dirname, 'templates/my-plugin.js'),
  fileName: 'my-plugin.js',
  options: {
    pluginMessage: 'Привет из вашего плагина!'
  }
})
  1. Nuxt сгенерирует соответствующий файл в .nuxt/my-plugin.js, где <%= pluginMessage %> будет заменён на строку из ваших опций.

Формат шаблонов

В шаблоны обычно вставляют переменные с помощью выражений вида <%= variable %>. Используется ejs-подобный синтаксис. Вы можете проводить простые вычисления, добавлять условия и другие описания.

2. Настраиваем app.html — HTML-шелл приложения

В корне проекта можно создать свой файл app.html. Он заменит стандартный HTML-шаблон, который Нuxt генерирует сам.

Это мощный способ полностью контролировать HTML-структуру root-документа. Например, для внедрения нестандартной разметки, дополнительных метатегов, CDN, подключения аналитики и других кастомных скриптов.

Пример:

<!-- app.html -->
<!DOCTYPE html>
<html {{ HTML_ATTRS }}>
  <head {{ HEAD_ATTRS }}>
    {{ HEAD }}
    <link rel="stylesheet" href="https://cdn.example.com/styles.css">
  </head>
  <body {{ BODY_ATTRS }}>
    <div id="__nuxt">{{ APP }}</div>
    <!-- Можно добавить свой шаблонный блок: -->
    <script>
      window.myConfig = '{{ MY_CUSTOM_CONFIG }}'
    </script>
  </body>
</html>

Как видите, значки {{ VAR }} — это специальные плейсхолдеры Nuxt, которые будут автоматически подставлены при формировании страницы (например, {{ APP }} — основной Vue-приложение, {{ HEAD }} — мета-теги и т.д.).

3. Генерация Error страниц и кастомизированных layout

Вы можете создавать и автоматически использовать шаблоны для error-страниц (например, кастомный error.vue в директории layouts или pages). Nuxt при необходимости сам подставит этот layout для страниц с ошибками.

Пример файла:

<!-- layouts/error.vue -->
<template>
  <div class="error-page">
    <h1>Ошибка {{ error.statusCode }}</h1>
    <p>{{ error.message }}</p>
    <!-- Можно добавить кастомный шаблонный контент -->
  </div>
</template>
<script setup>
defineProps({
  error: Object
})
</script>

4. Кастомизация конфигурационных файлов с помощью шаблонов

С помощью шаблонов можно влиять даже на содержимое конфигурационных или серверных файлов:

// В модуле
build: {
  templates: [
    {
      src: resolve(__dirname, 'templates/server-middleware.js'),
      fileName: 'middleware/generated-mw.js',
      options: { middlewareParam: 'custom value' }
    }
  ]
}

Здесь при сборке middleware-файл будет автоматически сформирован с вашими параметрами.

5. Использование шаблонов для Nuxt-плагинов

Когда вы добавляете плагины через модуль или кастомировку, вы можете использовать шаблоны, чтобы подстраивать плагин под параметры пользователя.

Пример простого плагина-шаблона:

// templates/dynamic-api.js
export default defineNuxtPlugin(nuxtApp => {
  // <%= apiBase %> будет заменён на значение
  nuxtApp.provide('apiBase', '<%= apiBase %>')
})

Код добавления из модуля:

// В модулях
nuxt.options.build.templates.push({
  src: resolve(__dirname, 'templates/dynamic-api.js'),
  fileName: 'dynamic-api.js',
  options: { apiBase: 'https://api.mysite.ru/v1/' }
})

Теперь вы сможете во всех компонентах получать значение через inject:

const apiBase = inject('apiBase') // будет https://api.mysite.ru/v1/

Варианты подключения и генерации шаблонов

Через модули

Большинство кастомных шаблонов встраиваются через Nuxt-модули. Ваш модуль может добавлять к сборке файлы, которых нет изначально, а также генерировать кастомные плагины, middleware, utils и другие артефакты на основе параметров конфигурации пользователя.

Через nuxt.config

В определённых случаях, если шаблон нужен "просто так", можно добавить его к сборке через hooks в nuxt.config, воспользовавшись событиями типа build:before, nitro:config и т.д.

Пример добавления шаблона через хук:

// nuxt.config.js
export default defineNuxtConfig({
  hooks: {
    // В момент конфигурации nitro
    'nitro:config'(conf) {
      conf.templates = conf.templates || []
      conf.templates.push({
        src: './templates/custom-env.js',
        dst: 'custom-env.js',
        options: { apiKey: process.env.MY_API_KEY }
      })
    }
  }
})

Через специальные директории

Некоторые шаблоны (например, для кастомизации app.html или error.vue) нужно разместить строго в корневых директориях проекта и Nuxt автоматически их подхватит.

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

  • Используйте шаблоны для генерации файлов, которые сильно зависят от окружения или разных опций пользователя.
  • Для пакетов и модулей Nuxt не кладите все шаблоны в одну кучу: разделяйте их по назначению (plugins, middleware, utils).
  • В шаблоне избегайте передачи избыточных данных, чтобы не раскрывать чувствительные значения в итоговых файлах.
  • Проверяйте шаблон на синтаксис перед добавлением в проект — ошибки в ejs-блоках сильно усложняют отладку.
  • Используйте шаблоны для «обёртывания» сторонних библиотек: можно автоматически подставлять api-ключи, пути к сервисам, различные переменные.

Заключение

Шаблоны (templates) в Nuxt открывают множество возможностей для автоматизации рутины, инкапсуляции логики и адаптации проекта под любые требуемые параметры. С помощью шаблонов вы можете динамически формировать плагины, middleware, кастомные конфигурации, управлять HTML-шеллом приложения и многим другим. Эти средства особенно полезны при создании собственных модулей, интеграций с сервисами, организации многоразовых решений внутри одной или нескольких команд. Старайтесь применять шаблоны там, где это действительно упрощает архитектуру — и вы получите максимально гибкое и легко расширяемое Nuxt-приложение.

Шаблоны - это важная часть Nuxt-приложений, но это не единственная. Чтобы создавать гибкие и масштабируемые приложения, необходимо освоить все возможности фреймворка, включая работу с сервером, базами данных и API. На нашем курсе Nuxt - fullstack Vue фреймворк вы найдете все необходимые знания и навыки для достижения успеха. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в Nuxt прямо сегодня.

Частозадаваемые технические вопросы по теме шаблонов и их ответы

Вопрос 1. Как задать условия (if/else) внутри шаблона?

В шаблонах Nuxt можно использовать стандартные ejs-конструкции. Например:

// В шаблоне .js
<% if (isDev) { %>
console.log('Development mode!');
<% } else { %>
console.log('Production mode!');
<% } %>

Передайте isDev через options — условие выполнится корректно.

Вопрос 2. Почему шаблон не применяется, если файл лежит вне модуля?

Nuxt автоматически ищет шаблоны только в специальных директориях или внутри модулей. Если вы хотите интегрировать кастомный шаблон из произвольного места, воспользуйтесь хуками (например, в nuxt.config — build:before или nitro:config), и явно укажите путь к вашему шаблону.

Вопрос 3. Как изменить сгенерированный шаблон после сборки?

После сборки файлы попадают в папку .nuxt. Не изменяйте их вручную — используйте для этого свои шаблоны/модули или создайте плагин, который дополнительно меняет поведение при старте.

Вопрос 4. Можно ли использовать шаблоны для генерации динамических route-файлов?

Да. Шаблоны подходят для генерации любых файлов, в том числе routes. Например, при интеграции с CMS — генерируйте маршрут на каждый опубликованный материал через шаблон, получая данные из внешнего API на этапе сборки.

Вопрос 5. Какие переменные доступны в шаблоне app.html?

В шаблоне app.html доступны плейсхолдеры: {{ HTML_ATTRS }}, {{ HEAD_ATTRS }}, {{ HEAD }}, {{ BODY_ATTRS }}, {{ APP }} и переменные, которые вы явно передадите через модули/конфиг. Также вы можете передавать параметры через Nuxt плагины или middleware, если нужно что-то более специфичное.

Стрелочка влевоИнтеграция Pinia для управления состоянием в NuxtКак использовать nuxt set для конфигурации NuxtСтрелочка вправо

Постройте личный план изучения 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 ₽
Подробнее

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