Создание автоматизированной среды для мгновенного деплоя сгенерированного ИИ фронтенд-кода в продакшен

Computing/Software9 min read

TuBrief Editorial Written with AI assistance from the source video. The video is the authority. Source video: Этот навык сделал Kimi K3 в 10 раз лучшим дизайнером · AI LABS

Когда смотришь демонстрационные видео ИИ-инструментов, кажется, что достаточно нажать пару кнопок и ввести несколько фраз, чтобы получить потрясающий UI. Проблема заключается в реальности. Как только код, сгенерированный ИИ, переносится в существующий проект, вся верстка рушится, а управление состоянием превращается в хаос. Каждому из нас наверняка приходилось тратить вдвое больше времени на разработку, пытаясб исправить и адаптировать такой код.

В конечном счете, чтобы использовать ИИ-код без головной боли, необходимо объединить статический анализ, структурирование состояния и визуальную проверку в автоматизированные защитные барьеры (guardrails). Ниже описана конкретная настройка, которая позволяет получать код, готовый к использованию сразу, без необходимости сидеть над правками целыми ночами.

Отсечение произвольных классов Tailwind и инлайн-стилей

ИИ может отлично понимать контекст, но внезапно начать игнорировать токены проекта. Он способен на свое усмотрение вставить инлайн-стили с hex-кодами или произвольные значения в квадратных скобках, такие как w-[327px]. В результате дизайн-система мгновенно рушится, а приоритеты CSS путаются.

Искать и исправлять это вручную — слишком долго. Нужно перекрыть этот путь с помощью линтера.

  1. Установите необходимые пакеты в проект.
    `bash
    npm install -D eslint-plugin-tailwindcss @html-eslint/eslint-plugin

`

  1. Добавьте в файл eslint.config.mjs правила, которые определяют произвольные значения в квадратных скобках и инлайн-стили как ошибки.
  2. Зарегистрируйте script npx eslint --fix в package.json и запускайте его сразу после получения кода.

При такой настройке, как только в коде появятся квадратные скобки или инлайн-стили, линтер пометит их как ошибку и принудительно заменит на ближайшие стандартные утилитарные классы. Избавление от этой рутины сэкономило более 5 часов в неделю, которые раньше уходили на подгонку стилей.

`javascript
// eslint.config.mjs
import eslintPluginTailwindcss from "eslint-plugin-tailwindcss";
import { defineConfig } from "eslint/config";

export default defineConfig([
{
plugins: {
tailwindcss: eslintPluginTailwindcss,
},
settings: {
tailwindcss: {
cssConfigPath: "./styles/tailwind.css",
},
},
rules: {
"tailwindcss/no-arbitrary-value": "error",
"tailwindcss/no-custom-classname": [
"error",
{ whitelist: ["custom-*"] },
],
"tailwindcss/classnames-order": "warn",
},
},
]);

`

Правило линтинга Метод проверки Пример блокируемого объекта Результат автоисправления
@html-eslint/no-inline-styles Блокировка инлайн-стилей JSX <div style={{color: '#ff0a00'}}> <div className="text-destructive">
tailwindcss/no-arbitrary-value Блокировка произвольных значений в скобках <button className="w-[327px]"> <button className="w-80">
tailwindcss/no-custom-classname Обнаружение незарегистрированных имен классов <div className="my-custom-card"> <div className="rounded-lg border bg-card shadow-sm">

Наведение порядка с useState, разбросанными внутри компонентов

Если попросить ИИ создать React-компонент, в девяти случаях из десяти он разбросает три-четыре useState внутри одного файла. Если к этому добавятся асинхронные вызовы API и обработка ошибок, произойдет взрыв повторных рендеров.

Состояние клиентского UI необходимо выносить в Zustand, а серверные данные — в React Query. Для форм следует зафиксировать структуру с помощью комбинации Zod и react-hook-form.

  1. Установите библиотеки зависимостей.
    `bash
    npm install @tanstack/react-query zod react-hook-form @hookform/resolvers

`

  1. Запретите прямое использование fetch в схеме промпта ИИ и заставьте его сначала определять типы с помощью схемы Zod.
  2. Подключите zodResolver к react-hook-form для автоматизации валидации и настройте структуру так, чтобы при отправке вызывался useMutation.

Лишние повторные рендеры полностью исчезнут. А ошибки валидации вводимых данных даже не пройдут внутрь компонента.

`typescript
import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { z } from 'zod';

export const userProfileSchema = z.object({
username: z.string().min(2, { message: 'Имя должно содержать минимум 2 символа.' }),
email: z.string().email({ message: 'Некорректный формат email.' }),
role: z.enum(['admin', 'user'], { required_error: 'Выберите роль.' }),
});

export type UserProfileInputs = z.infer;

export function ProfileForm() {
const {
register,
handleSubmit,
formState: { errors },
} = useForm({
resolver: zodResolver(userProfileSchema),
});

const onSubmit = (data: UserProfileInputs) => {
// Выполнение React Query Mutation
};

return (


{/* Разметка формы */}

);
}

`

Область Антипаттерн ИИ Очищенная структура Преимущество
Состояние клиента Фрагментированные useState Единое хранилище Zustand Предотвращение лишних ререндеров
Серверные данные fetch внутри useEffect Обертка React Query Автоматическое кэширование и декларативная обработка загрузки
Валидация форм Ручная проверка условными операторами Zod + react-hook-form Типобезопасность и автоматизация валидации

Цикл тестирования для визуального отслеживания нарушений верстки

Посмотреть на один экран десктопа и подумать "О, отлично выглядит", а потом открыть на мобильном и увидеть полнейший хаос в макете — обычное дело. Согласно отчету WebAIM о веб-доступности за 2025 год, только на главных страницах 1 миллиона топовых сайтов возникает в среднем более 51 ошибки WCAG. Что уж говорить о нарушениях адаптивности в коде, только что сгенерированном ИИ.

Автоматизация регрессионного тестирования с помощью Playwright и Pixelmatch избавляет от необходимости вручную уменьшать окно браузера для проверки.

  1. Установите инструменты тестирования.
    `bash
    npm install -D @playwright/test @axe-core/playwright

`

  1. Добавьте скрипт, который делает скриншоты, проходя по вьюпортам мобильных устройств (375px), планшетов (768px) и десктопов (1440px).
  2. Установите пороговое значение maxDiffPixelRatio на 0.02. При его превышении изображение с пиксельными различиями повторно отправляется в промпт ИИ для переписывания медиа-запросов.

После запуска этого цикла тестирования рендеринга время ручной проверки UI сократилось более чем на 80%.

`typescript
import { test, expect } from '@playwright/test';

const viewports = [
{ name: 'mobile', width: 375, height: 667 },
{ name: 'tablet', width: 768, height: 1024 },
{ name: 'desktop', width: 1440, height: 900 },
];

for (const vp of viewports) {
test(Responsive layout test - ${vp.name}, async ({ page }) => {
await page.setViewportSize({ width: vp.width, height: vp.height });
await page.goto('/render-test-harness');

await expect(page.locator('#ai-component-root')).toHaveScreenshot(
  `component-${vp.name}.png`,
  {
    maxDiffPixelRatio: 0.02,
    threshold: 0.2,
    animations: 'disabled',
  }
);

});
}

`

Отфильтровывание странного кода прямо перед коммитом

Как бы хорошо ни был составлен промпт, ИИ иногда выдает странный "мусорный" код — так же непредсказуемо, как работает кондиционер. Код, который ломает типы или не проходит линтинг прямо перед коммитом, не должен даже попадать в рабочее пространство Git.

Настройте Git hooks с помощью Lefthook.

  1. Установите Lefthook в проект и создайте lefthook.yml в корневой директории.
    `bash
    npm install -D lefthook

`

  1. На этапе pre-commit добавьте команды проверки ESLint, Prettier и TypeScript.
  2. Включите опцию stage_fixed: true, чтобы автоматически исправленные изменения сразу попадали в коммит.

Если есть исправленные ошибки типов или случайно удаленные Props, коммит будет заблокирован прямо на месте. Это самый надежный способ покончить с неэффективностью, когда разработчику приходится лично выступать в роли ревьюера и подчищать за ИИ.

`yaml

lefthook.yml

pre-commit:
commands:
eslint-autofix:
glob: ".{js,ts,jsx,tsx}"
run: npx eslint --fix {staged_files}
stage_fixed: true
prettier-format:
glob: "
.{js,ts,jsx,tsx,css,json}"
run: npx prettier --write {staged_files}
stage_fixed: true
typescript-check:
glob: "*.{ts,tsx}"
run: npx tsc --noEmit

`

Related Video

Этот навык сделал Kimi K3 в 10 раз лучшим дизайнером

AI LABS15:15

More from the community

Comments

Log in to leave a comment.

No comments yet.