10 промтов для создания React/Next.js приложений: шпаргалка для фронтендеров

Введение

Разработка на React и Next.js стала стандартом в современном фронтенде. Однако написание однотипных компонентов, настройка маршрутизации или интеграция API часто отнимает время, которое можно было бы потратить на более сложные задачи. С появлением языковых моделей, таких как GPT-4 и Claude 3.5, у разработчиков появился мощный инструмент для автоматизации рутины. В этой статье я собрал 10 проверенных промтов (запросов для AI), которые помогут вам быстрее создавать React-компоненты и Next.js-страницы. Каждый промт сопровождается пояснением и примером использования.

Эти промты я тестировал в July 2026 года с использованием последних версий Next.js 15 и React 19. Они работают в ChatGPT, Claude и Copilot. Главный принцип: промт должен быть конкретным, содержать контекст и требования, а AI выдаёт готовый код, который остаётся только адаптировать под свой проект.

1. Промт для генерации функционального компонента с TypeScript

Для чего: Быстрое создание типизированного компонента с пропсами, без лишнего бойлерплейта.

Промт:

Напиши функциональный React-компонент на TypeScript для карточки товара. Компонент должен принимать пропсы: id (string), title (string), price (number), imageUrl (string), isAvailable (boolean). Используй React.FC. Добавь обработчик клика, который выводит в консоль id товара. Стили — CSS-in-JS через объект styles.

Пример использования:

interface ProductCardProps {
  id: string;
  title: string;
  price: number;
  imageUrl: string;
  isAvailable: boolean;
}

const ProductCard: React.FC<ProductCardProps> = ({ id, title, price, imageUrl, isAvailable }) => {
  const handleClick = () => {
    console.log('Clicked product ID:', id);
  };

  return (
    <div style={styles.card} onClick={handleClick}>
      <img src={imageUrl} alt={title} style={styles.image} />
      <h3 style={styles.title}>{title}</h3>
      <p style={styles.price}>${price}</p>
      <p style={{ color: isAvailable ? 'green' : 'red' }}>
        {isAvailable ? 'In stock' : 'Out of stock'}
      </p>
    </div>
  );
};

const styles = {
  card: { border: '1px solid #ddd', padding: '16px', borderRadius: '8px', cursor: 'pointer' },
  image: { width: '100%', height: '200px', objectFit: 'cover' },
  title: { fontSize: '18px', fontWeight: 'bold' },
  price: { fontSize: '16px', color: '#333' },
};

export default ProductCard;

2. Промт для генерации страницы Next.js с серверным рендерингом

Для чего: Создание страницы с getServerSideProps или серверного компонента в App Router.

Промт:

Создай страницу Next.js 15 (App Router) для блога. Используй серверный компонент. Страница должна получать список постов через fetch с API https://jsonplaceholder.typicode.com/posts (ограничь до 10). Отобрази заголовки постов в виде списка ссылок на страницу /posts/[id]. Добавь метаданные через generateMetadata.

Пример использования:

// app/posts/page.tsx
export async function generateMetadata() {
  return {
    title: 'Blog Posts',
    description: 'List of latest blog posts',
  };
}

interface Post {
  id: number;
  title: string;
}

async function getPosts(): Promise<Post[]> {
  const res = await fetch('https://jsonplaceholder.typicode.com/posts?_limit=10');
  if (!res.ok) throw new Error('Failed to fetch posts');
  return res.json();
}

export default async function PostsPage() {
  const posts = await getPosts();

  return (
    <div>
      <h1>Blog Posts</h1>
      <ul>
        {posts.map((post) => (
          <li key={post.id}>
            <a href={`/posts/${post.id}`}>{post.title}</a>
          </li>
        ))}
      </ul>
    </div>
  );
}

3. Промт для создания кастомного хука

Для чего: Генерация переиспользуемой логики, например, для работы с API.

Промт:

Напиши кастомный хук useFetch для React. Он должен принимать URL (string) и возвращать объект с полями: data (any

| null), loading (boolean), error (string | null). Используй useEffect и useState. Добавь возможность повторного запроса через функцию refetch.

Пример использования:

import { useState, useEffect } from 'react';

function useFetch<T>(url: string) {
  const [data, setData] = useState<T | null>(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);

  const fetchData = async () => {
    setLoading(true);
    setError(null);
    try {
      const response = await fetch(url);
      if (!response.ok) throw new Error('Network error');
      const result = await response.json();
      setData(result);
    } catch (err) {
      setError(err instanceof Error ? err.message : 'Unknown error');
    } finally {
      setLoading(false);
    }
  };

  useEffect(() => {
    fetchData();
  }, [url]);

  return { data, loading, error, refetch: fetchData };
}

export default useFetch;

4. Промт для генерации формы с валидацией

Для чего: Создание формы с обработкой ошибок и отправкой данных.

Промт:

Создай React-компонент формы регистрации с полями: email (email), password (password, минимум 8 символов), confirmPassword. Используй хук useState для управления состоянием. Добавь валидацию: email должен содержать @, пароли должны совпадать. При успешной отправке выведи alert с сообщением. Стили через CSS модули.

Пример использования:

import { useState } from 'react';
import styles from './RegisterForm.module.css';

const RegisterForm = () => {
  const [form, setForm] = useState({ email: '', password: '', confirmPassword: '' });
  const [errors, setErrors] = useState<{ email?: string; password?: string; confirmPassword?: string }>({});

  const validate = () => {
    const newErrors: typeof errors = {};
    if (!form.email.includes('@')) newErrors.email = 'Invalid email';
    if (form.password.length < 8) newErrors.password = 'Password must be at least 8 characters';
    if (form.password !== form.confirmPassword) newErrors.confirmPassword = 'Passwords do not match';
    setErrors(newErrors);
    return Object.keys(newErrors).length === 0;
  };

  const handleSubmit = (e: React.FormEvent) => {
    e.preventDefault();
    if (validate()) alert('Registration successful!');
  };

  return (
    <form className={styles.form} onSubmit={handleSubmit}>
      <input
        type="email"
        placeholder="Email"
        value={form.email}
        onChange={(e) => setForm({ ...form, email: e.target.value })}
      />
      {errors.email && <span className={styles.error}>{errors.email}</span>}
      <input
        type="password"
        placeholder="Password"
        value={form.password}
        onChange={(e) => setForm({ ...form, password: e.target.value })}
      />
      {errors.password && <span className={styles.error}>{errors.password}</span>}
      <input
        type="password"
        placeholder="Confirm Password"
        value={form.confirmPassword}
        onChange={(e) => setForm({ ...form, confirmPassword: e.target.value })}
      />
      {errors.confirmPassword && <span className={styles.error}>{errors.confirmPassword}</span>}
      <button type="submit">Register</button>
    </form>
  );
};

export default RegisterForm;

5. Промт для настройки маршрутизации Next.js

Для чего: Быстрое создание динамических маршрутов и вложенных layout.

Промт:

Создай структуру маршрутов для Next.js App Router: главная страница (/), страница продуктов (/products), страница отдельного продукта (/products/[id]), страница корзины (/cart). Для страницы продуктов создай layout с навигацией. Используй файловую систему Next.js 15.

Пример использования:

// app/layout.tsx  корневой layout
// app/page.tsx  главная
// app/products/layout.tsx  layout для продуктов с навигацией
// app/products/page.tsx  список продуктов
// app/products/[id]/page.tsx  детальная страница продукта
// app/cart/page.tsx  корзина

Полный код layout для продуктов:

// app/products/layout.tsx
import Link from 'next/link';

export default function ProductsLayout({ children }: { children: React.ReactNode }) {
  return (
    <div>
      <nav>
        <Link href="/products">All Products</Link>
        <Link href="/cart">Cart</Link>
      </nav>
      {children}
    </div>
  );
}

6. Промт для интеграции с API и авторизацией

Для чего: Написание middleware для проверки аутентификации в Next.js.

Промт:

Напиши middleware для Next.js 15, который проверяет наличие JWT токена в cookies. Если токен отсутствует и пользователь пытается зайти на /dashboard или /profile, перенаправляй на /login. Для публичных страниц (/, /about) middleware не применяется.

Пример использования:

// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';

export function middleware(request: NextRequest) {
  const token = request.cookies.get('jwt')?.value;
  const protectedPaths = ['/dashboard', '/profile'];
  const isProtected = protectedPaths.some((path) => request.nextUrl.pathname.startsWith(path));

  if (isProtected && !token) {
    return NextResponse.redirect(new URL('/login', request.url));
  }

  return NextResponse.next();
}

export const config = {
  matcher: ['/dashboard/:path*', '/profile/:path*'],
};

7. Промт для создания контекста и провайдера

Для чего: Генерация глобального состояния через React Context.

Промт:

Создай контекст темы (ThemeContext) для React. Контекст должен хранить текущую тему ('light' или 'dark') и функцию toggleTheme. Напиши провайдер ThemeProvider, который оборачивает дочерние компоненты. Используй useState для управления состоянием. Типизируй через TypeScript.

Пример использования:

import React, { createContext, useContext, useState, ReactNode } from 'react';

interface ThemeContextType {
  theme: 'light' | 'dark';
  toggleTheme: () => void;
}

const ThemeContext = createContext<ThemeContextType | undefined>(undefined);

export const ThemeProvider = ({ children }: { children: ReactNode }) => {
  const [theme, setTheme] = useState<'light' | 'dark'>('light');

  const toggleTheme = () => {
    setTheme((prev) => (prev === 'light' ? 'dark' : 'light'));
  };

  return (
    <ThemeContext.Provider value={{ theme, toggleTheme }}>
      {children}
    </ThemeContext.Provider>
  );
};

export const useTheme = () => {
  const context = useContext(ThemeContext);
  if (!context) throw new Error('useTheme must be used within ThemeProvider');
  return context;
};

8. Промт для генерации компонента с анимациями

Для чего: Создание анимированных элементов с помощью CSS или библиотеки framer-motion.

Промт:

Создай React-компонент модального окна с анимацией появления и закрытия. Используй framer-motion. Модальное окно должно появляться с эффектом fade-in и scale. При закрытии — fade-out. Принимай пропсы: isOpen (boolean), onClose (function), children (ReactNode).

Пример использования:

import { motion, AnimatePresence } from 'framer-motion';

interface ModalProps {
  isOpen: boolean;
  onClose: () => void;
  children: React.ReactNode;
}

const Modal = ({ isOpen, onClose, children }: ModalProps) => {
  return (
    <AnimatePresence>
      {isOpen && (
        <motion.div
          initial={{ opacity: 0, scale: 0.8 }}
          animate={{ opacity: 1, scale: 1 }}
          exit={{ opacity: 0, scale: 0.8 }}
          transition={{ duration: 0.3 }}
          style={{
            position: 'fixed',
            top: 0, left: 0, right: 0, bottom: 0,
            display: 'flex',
            alignItems: 'center',
            justifyContent: 'center',
            background: 'rgba(0,0,0,0.5)',
          }}
          onClick={onClose}
        >
          <motion.div
            onClick={(e) => e.stopPropagation()}
            style={{ background: 'white', padding: '24px', borderRadius: '8px' }}
          >
            {children}
          </motion.div>
        </motion.div>
      )}
    </AnimatePresence>
  );
};

export default Modal;

9. Промт для создания компонента с бесконечной прокруткой

Для чего: Генерация списка с подгрузкой данных при скролле.

Промт:

Создай React-компонент InfiniteScrollList, который загружает данные из API (https://jsonplaceholder.typicode.com/posts) по 5 элементов за раз. Используй IntersectionObserver для отслеживания достижения конца списка. Показывай индикатор загрузки. Типизируй на TypeScript.

Пример использования:

import { useState, useEffect, useRef, useCallback } from 'react';

interface Post {
  id: number;
  title: string;
}

const InfiniteScrollList = () => {
  const [posts, setPosts] = useState<Post[]>([]);
  const [page, setPage] = useState(1);
  const [loading, setLoading] = useState(false);
  const observerRef = useRef<HTMLDivElement | null>(null);

  const fetchPosts = useCallback(async () => {
    setLoading(true);
    const res = await fetch(`https://jsonplaceholder.typicode.com/posts?_page=${page}&_limit=5`);
    const data = await res.json();
    setPosts((prev) => [...prev, ...data]);
    setLoading(false);
  }, [page]);

  useEffect(() => {
    fetchPosts();
  }, [fetchPosts]);

  useEffect(() => {
    const observer = new IntersectionObserver(
      (entries) => {
        if (entries[0].isIntersecting && !loading) {
          setPage((prev) => prev + 1);
        }
      },
      { threshold: 1.0 }
    );

    if (observerRef.current) observer.observe(observerRef.current);
    return () => observer.disconnect();
  }, [loading]);

  return (
    <div>
      {posts.map((post) => (
        <div key={post.id} style={{ padding: '10px', borderBottom: '1px solid #ccc' }}>
          {post.title}
        </div>
      ))}
      <div ref={observerRef} style={{ height: '20px' }}>
        {loading && <p>Loading...</p>}
      </div>
    </div>
  );
};

export default InfiniteScrollList;

10. Промт для генерации тестов (Jest + React Testing Library)

Для чего: Автоматическое написание юнит-тестов для компонентов.

Промт:

Напиши тесты для React-компонента Button (пропсы: label, onClick, disabled). Используй Jest и React Testing Library. Проверь: рендеринг с label, вызов onClick при клике, отключение кнопки при disabled={true}.

Пример использования:

import { render, screen, fireEvent } from '@testing-library/react';
import Button from './Button';

describe('Button component', () => {
  test('renders with label', () => {
    render(<Button label="Click me" onClick={() => {}} />);
    expect(screen.getByText('Click me')).toBeInTheDocument();
  });

  test('calls onClick when clicked', () => {
    const handleClick = jest.fn();
    render(<Button label="Click" onClick={handleClick} />);
    fireEvent.click(screen.getByText('Click'));
    expect(handleClick).toHaveBeenCalledTimes(1);
  });

  test('is disabled when disabled prop is true', () => {
    render(<Button label="Disabled" onClick={() => {}} disabled />);
    expect(screen.getByText('Disabled')).toBeDisabled();
  });
});

Заключение

Эти 10 промтов покрывают большинство повседневных задач фронтенд-разработчика на React и Next.js. Главное преимущество использования AI — экономия времени на шаблонном коде и возможность сосредоточиться на бизнес-логике. Однако помните: AI генерирует код, но вы отвечаете за его качество, безопасность и производительность. Всегда проверяйте сгенерированный код, особенно при работе с пользовательскими данными.

Попробуйте адаптировать эти промты под свои проекты, добавляя специфические требования (например, определённую библиотеку компонентов или архитектурный паттерн). Со временем вы научитесь формулировать промты так, чтобы получать готовый к использованию код с минимальными правками.

Хотите углубиться в тему? ASI Biont поддерживает подключение к различным AI-инструментам через API — подробнее на asibiont.com/courses. Это поможет вам интегрировать промты прямо в ваш рабочий процесс.

Удачного кодинга!

← Все статьи

Комментарии

Читайте также

Как руководить ИИ-трансформацией: руководство по курсу «Лидерство в области ИИ и науки о данных — Chief AI Officer» на Asibiont.com

15 июля 2026

Взлом показал, что AI-генератор музыки Suno, вероятно, использовал YouTube для обучения

15 июля 2026

SpaceX уходит ниже цены IPO в $135 накануне запуска Starship: что стоит за падением и как Vibe Coding меняет правила игры

15 июля 2026

Как создать и запустить технологический стартап: полный курс для основателей на asibiont.com

15 июля 2026

10 промтов для Swift и iOS: SwiftUI, UIKit, Core Data — готовые решения для разработчика

15 июля 2026

Преобразите свои заметки с помощью интеграции Obsidian и ИИ: как ИИ-агент автоматизирует вашу базу знаний

15 июля 2026

Автоматизируйте свою бухгалтерию: Полное руководство по интеграции QuickBooks с ИИ ASI Biont

15 июля 2026

BI-аналитика и дашборды: как освоить Power BI, Tableau и Metabase с AI-обучением на Asibiont

15 июля 2026

Освойте искусство общения с ИИ: глубокое погружение в курс по промпт-инжинирингу на asibiont.com

15 июля 2026