Введение
Vue.js и Nuxt — одни из самых популярных фреймворков для создания современных веб-приложений. Они предоставляют мощные инструменты для работы с компонентами, composables, роутингом и состоянием. Однако даже опытные разработчики часто тратят время на написание шаблонного кода. В этой статье мы собрали 10 готовых промтов (промптов), которые помогут вам ускорить разработку и избежать типичных ошибок. Каждый промт — это конкретная инструкция для AI-ассистента, которую можно скопировать и сразу использовать в проекте.
Почему это важно? Согласно опросу State of JS 2025, Vue.js остаётся в топе по удовлетворённости разработчиков, а Nuxt 3, выпущенный в 2022 году и активно развивающийся, используется в 35% новых проектов на Vue (источник: официальная статистика Nuxt). Умение быстро генерировать качественный код с помощью промтов — это навык, который экономит часы работы. В этой подборке вы найдёте промты для компонентов, composables, роутинга, Pinia store и других ключевых элементов Vue/Nuxt.
1. Промт для создания компонента с TypeScript и props
Для чего: Быстро создать типизированный Vue-компонент с props, emits и слотами. Идеально для старта нового компонента.
Промт:
Создай Vue 3 компонент на Composition API с TypeScript. Компонент должен называться UserCard. Пропсы: name (string, required), age (number, optional), avatarUrl (string, optional с default). Emits: 'click' и 'update:name'. Добавь слот по умолчанию для дополнительного контента. Используй defineProps и defineEmits.
Пример использования: Скопируйте промт в AI-ассистент (например, ChatGPT, Claude или GitHub Copilot). Через несколько секунд вы получите готовый код:
<template>
<div class="user-card" @click="emit('click')">
<img v-if="avatarUrl" :src="avatarUrl" alt="avatar" />
<h3>{{ name }}</h3>
<p v-if="age">{{ age }} years old</p>
<slot />
</div>
</template>
<script setup lang="ts">
interface Props {
name: string;
age?: number;
avatarUrl?: string;
}
const props = withDefaults(defineProps<Props>(), {
avatarUrl: '/default-avatar.png'
});
const emit = defineEmits<{
(e: 'click'): void;
(e: 'update:name', value: string): void;
}>();
</script>
2. Промт для composable с асинхронной загрузкой данных
Для чего: Создать composable для получения данных с API, с обработкой состояний загрузки и ошибок. Экономит время на написание стандартной логики.
Промт:
Напиши composable для Vue 3 useFetchData, который принимает URL (string) и опциональные параметры запроса (object). Возвращает ref: data, error, isLoading. Используй fetch API и onMounted для вызова при монтировании. Добавь возможность повторного запроса через метод refresh.
Пример использования: После генерации вы получите готовый composable, который можно импортировать в любой компонент. Например:
import { ref, onMounted, type Ref } from 'vue';
interface UseFetchDataReturn<T> {
data: Ref<T | null>;
error: Ref<string | null>;
isLoading: Ref<boolean>;
refresh: () => Promise<void>;
}
export function useFetchData<T = unknown>(url: string, params?: Record<string, string>): UseFetchDataReturn<T> {
const data = ref<T
| null>(null) as Ref<T | null>;
const error = ref<string | null>(null);
const isLoading = ref(false);
const fetchData = async () => {
isLoading.value = true;
error.value = null;
try {
const queryString = params ? '?' + new URLSearchParams(params).toString() : '';
const response = await fetch(url + queryString);
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
data.value = await response.json();
} catch (err) {
error.value = err instanceof Error ? err.message : 'Unknown error';
} finally {
isLoading.value = false;
}
};
onMounted(fetchData);
return { data, error, isLoading, refresh: fetchData };
}
3. Промт для динамического роутинга в Nuxt 3
Для чего: Настроить динамические маршруты в Nuxt 3 с параметрами и middleware. Подходит для страниц товаров, профилей пользователей и других динамических страниц.
Промт:
Создай страницу Nuxt 3 для динамического роутинга с параметром id в папке pages/users/[id].vue. Добавь middleware для проверки авторизации (useAuth). Используй useRoute для получения id и useFetch для загрузки данных пользователя. Обработай случаи, когда пользователь не найден (404).
Пример использования: После выполнения промта вы получите готовый файл pages/users/[id].vue:
<template>
<div>
<div v-if="loading">Загрузка...</div>
<div v-else-if="error">Ошибка: {{ error }}</div>
<div v-else-if="!user">Пользователь не найден</div>
<div v-else>
<h1>{{ user.name }}</h1>
<p>Email: {{ user.email }}</p>
</div>
</div>
</template>
<script setup lang="ts">
definePageMeta({
middleware: 'auth'
});
const route = useRoute();
const { data: user, error, pending: loading } = await useFetch(`/api/users/${route.params.id}`);
</script>
4. Промт для Pinia store с actions и getters
Для чего: Создать типизированный Pinia store с actions, getters и поддержкой TypeScript. Основа для управления состоянием в больших приложениях.
Промт:
Создай Pinia store для корзины покупок (cartStore) с использованием Options API. State: items (массив объектов с id, name, price, quantity). Getters: totalPrice, itemCount. Actions: addItem, removeItem, clearCart. Все данные должны быть типизированы с помощью TypeScript интерфейсов.
Пример использования: Промт генерирует готовый store, который можно подключить в компоненте:
import { defineStore } from 'pinia';
interface CartItem {
id: number;
name: string;
price: number;
quantity: number;
}
interface CartState {
items: CartItem[];
}
export const useCartStore = defineStore('cart', {
state: (): CartState => ({
items: []
}),
getters: {
totalPrice: (state) => state.items.reduce((sum, item) => sum + item.price * item.quantity, 0),
itemCount: (state) => state.items.reduce((count, item) => count + item.quantity, 0)
},
actions: {
addItem(item: CartItem) {
const existing = this.items.find(i => i.id === item.id);
if (existing) {
existing.quantity += item.quantity;
} else {
this.items.push({ ...item });
}
},
removeItem(id: number) {
this.items = this.items.filter(i => i.id !== id);
},
clearCart() {
this.items = [];
}
}
});
5. Промт для кастомной директивы v-focus
Для чего: Создать кастомную директиву для автоматического фокуса на элементе. Полезна для форм и модальных окон.
Промт:
Напиши кастомную директиву Vue 3 v-focus, которая устанавливает фокус на элементе при монтировании. Директива должна быть зарегистрирована глобально в main.ts. Добавь возможность модификатора .delay для задержки фокуса (например, v-focus.delay="500").
Пример использования: После создания директивы вы сможете использовать её в любом компоненте: <input v-focus.delay="200" />.
6. Промт для composable useDebounce
Для чего: Создать composable для дебаунса функций. Необходим для оптимизации поиска, фильтрации и других частых вызовов.
Промт:
Создай composable useDebounce, который принимает функцию и задержку (ms). Возвращает debounced версию функции. Используй setTimeout и clearTimeout. Добавь опцию immediate для немедленного вызова.
Пример использования:
import { ref } from 'vue';
export function useDebounce<T extends (...args: unknown[]) => unknown>(fn: T, delay: number, immediate = false) {
let timer: ReturnType<typeof setTimeout> | null = null;
const debounced = (...args: Parameters<T>) => {
if (timer) clearTimeout(timer);
if (immediate && !timer) {
fn(...args);
}
timer = setTimeout(() => {
fn(...args);
timer = null;
}, delay);
};
return { debounced };
}
7. Промт для middleware в Nuxt 3
Для чего: Создать middleware для проверки аутентификации. Базовый элемент защиты маршрутов в Nuxt.
Промт:
Создай middleware для Nuxt 3 под названием auth. Он должен проверять, есть ли токен в localStorage. Если токена нет, перенаправлять на страницу /login. Используй navigateTo. Добавь проверку на стороне сервера (если процесс серверный, проверять cookie).
Пример использования:
// middleware/auth.ts
export default defineNuxtRouteMiddleware((to, from) => {
if (process.client) {
const token = localStorage.getItem('auth_token');
if (!token) {
return navigateTo('/login');
}
} else {
// Для SSR можно проверить cookie
const token = useCookie('auth_token').value;
if (!token) {
return navigateTo('/login');
}
}
});
8. Промт для компонента модального окна с Teleport
Для чего: Создать переиспользуемый компонент модального окна с использованием Teleport для корректного позиционирования.
Промт:
Создай Vue 3 компонент Modal с использованием Teleport. Компонент должен принимать пропсы: show (boolean), title (string). Добавь слот для контента. Закрытие по клику на оверлей и по нажатию Escape. Используй watch для синхронизации с show.
Пример использования: Полученный компонент можно использовать так:
<template>
<Teleport to="body">
<div v-if="show" class="modal-overlay" @click.self="close">
<div class="modal-content">
<h2>{{ title }}</h2>
<slot />
<button @click="close">Закрыть</button>
</div>
</div>
</Teleport>
</template>
<script setup lang="ts">
const props = defineProps<{ show: boolean; title: string }>();
const emit = defineEmits<{ (e: 'update:show', value: boolean): void }>();
const close = () => emit('update:show', false);
const handleEscape = (e: KeyboardEvent) => {
if (e.key === 'Escape') close();
};
onMounted(() => document.addEventListener('keydown', handleEscape));
onUnmounted(() => document.removeEventListener('keydown', handleEscape));
</script>
9. Промт для composable useLocalStorage
Для чего: Создать реактивную обёртку над localStorage с автоматической синхронизацией. Полезна для сохранения настроек пользователя.
Промт:
Напиши composable useLocalStorage, который принимает ключ (string) и значение по умолчанию. Возвращает ref, который автоматически синхронизируется с localStorage при изменении. Используй watch для отслеживания изменений. Обработай ошибки парсинга JSON.
Пример использования:
import { ref, watch, type Ref } from 'vue';
export function useLocalStorage<T>(key: string, defaultValue: T): Ref<T> {
const stored = localStorage.getItem(key);
const data = ref<T>(stored ? JSON.parse(stored) : defaultValue) as Ref<T>;
watch(data, (newVal) => {
try {
localStorage.setItem(key, JSON.stringify(newVal));
} catch (e) {
console.error('Failed to save to localStorage', e);
}
}, { deep: true });
return data;
}
10. Промт для создания плагина в Nuxt 3
Для чего: Создать плагин для глобальной регистрации компонентов или подключения внешних библиотек.
Промт:
Создай плагин Nuxt 3 под названием 'icons', который глобально регистрирует компонент Icon из библиотеки heroicons. Используй defineNuxtPlugin. Плагин должен работать только на клиенте. Добавь поддержку TypeScript путём расширения глобальных типов.
Пример использования:
// plugins/icons.client.ts
import { defineNuxtPlugin } from '#app';
import Icon from 'heroicons-vue';
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.component('Icon', Icon);
});
// Для TypeScript: declare module 'vue' { export interface GlobalComponents { Icon: typeof import('heroicons-vue').default } }
Заключение
Эти 10 промтов покрывают большинство повседневных задач при разработке на Vue.js и Nuxt. Используйте их как отправную точку — адаптируйте под свои проекты, добавляйте типизацию и обработку ошибок. Главное преимущество промтов — скорость: вместо 15 минут на написание шаблонного кода вы тратите 2 минуты на генерацию и доработку.
Помните, что AI — это инструмент, а не замена опыту. Всегда проверяйте сгенерированный код на соответствие вашему стеку и требованиям безопасности. Если вы работаете с большими проектами, рекомендую протестировать промты на небольших задачах, чтобы оценить качество генерации.
Для дальнейшего изучения рекомендую официальную документацию Vue.js (vuejs.org) и Nuxt (nuxt.com), а также гайды по Composition API. Успешной разработки!
Комментарии