Criando um ambiente automatizado para enviar código frontend gerado por IA direto para produção

Computing/Software9분 읽기

TuBrief 편집팀 원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다. 원본 영상: Esta Habilidade Acabou de Tornar o Kimi K3 um Designer 10x Melhor · AI LABS

Ao assistir aos vídeos de demonstração de ferramentas de IA, parece incrível: você clica em alguns botões, digita algumas frases e surge uma UI espetacular. O problema é a realidade. No momento em que você traz o código gerado pela IA para um projeto existente, todo o estilo se quebra e o gerenciamento de estado vira uma bagunça. Provavelmente todo mundo já passou pela experiência de gastar o dobro do tempo de desenvolvimento só tentando ajustar e consertar isso.

No fim das contas, para usar o código de IA sem dores de cabeça, é preciso amarrar a análise estática, a estruturação de estado e a validação visual em guardrails automatizados. Aqui está a configuração concreta para trazer esse código em um estado pronto para uso, sem precisar passar a noite em claro fazendo ajustes.

Eliminando classes Tailwind arbitrárias e estilos inline

A IA costuma entender bem o contexto, mas de repente ignora os tokens do projeto. Ela começa a inserir valores arbitrários entre colchetes, como w-[327px], ou estilos inline com códigos hexadecimais por conta própria. O design system ruiu instantaneamente e a prioridade do CSS vira um nó.

Se um ser humano tentar encontrar e corrigir isso a olho nu, já é tarde demais. É preciso bloquear a entrada usando um Linter.

  1. Instale os pacotes necessários no projeto.
    bash npm install -D eslint-plugin-tailwindcss @html-eslint/eslint-plugin

  2. No arquivo eslint.config.mjs, adicione regras para capturar valores arbitrários entre colchetes e estilos inline como erros.

  3. Registre npx eslint --fix nos scripts do seu Package e execute-o logo após receber o código.

Com essa estrutura, no momento em que um valor entre colchetes ou um estilo inline entra, o linter dispara um erro e força a substituição pela classe utilitária padrão mais próxima. Ao eliminar esse trabalho braçal, economizamos mais de 5 horas por semana que antes eram gastas ajustando estilos.

`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",
},
},
]);
`

Regra de Linting Método de verificação Exemplo de bloqueio Resultado da correção automática
@html-eslint/no-inline-styles Bloqueia estilos inline JSX <div style={{color: '#ff0a00'}}> <div className="text-destructive">
tailwindcss/no-arbitrary-value Bloqueia valores arbitrários entre colchetes <button className="w-[327px]"> <button className="w-80">
tailwindcss/no-custom-classname Detecta nomes de classes não registrados <div className="my-custom-card"> <div className="rounded-lg border bg-card shadow-sm">

Organizando a enxurrada de useState dentro do componente

Se você pedir à IA para criar um componente React, nove em cada dez vezes ela espalhará três ou quatro useState dentro de um único arquivo. Se chamadas de API assíncronas e tratamento de erros se misturarem a isso, uma bomba de renderização explodirá.

O estado da UI do cliente deve ser centralizado com Zustand, enquanto os dados do servidor devem ser separados com React Query. Para formulários de entrada, fixamos a estrutura usando a combinação de Zod e react-hook-form.

  1. Instale as bibliotecas de dependência.
    bash npm install @tanstack/react-query zod react-hook-form @hookform/resolvers

  2. No schema do prompt da IA, proíba o uso direto de fetch e faça com que ela defina os tipos primeiro usando o schema do Zod.

  3. Conecte o zodResolver ao react-hook-form para automatizar a validação e estruture o código para chamar useMutation no momento do submit.

As re-renderizações desnecessárias desaparecem completamente. Falhas na validação de entrada nem chegam a entrar no componente.

`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: '올바른 이메일 형식이 아닙니다.' }),
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 (


{/* 폼 레이아웃 */}

);
}
`

Área Anti-pattern da IA Estrutura refinada Vantagem
Estado do cliente useState fragmentado Store única no Zustand Previne re-renderizações desnecessárias
Dados do servidor fetch dentro de useEffect Abstração com React Query Caching automático e carregamento declarativo
Validação de formulário Checagem manual com condicionais Zod + react-hook-form Type safety e automação da validação

Loop de testes para capturar quebras de tela visualmente

Olhar apenas para uma tela de desktop e pensar "Nossa, ficou ótimo" para depois abrir no celular e ver o layout completamente destruído é algo extremamente comum. De acordo com o relatório de acessibilidade web de 2025 da WebAIM, ocorrem em média mais de 51 erros de WCAG apenas na página principal dos 1 milhão de sites mais acessados. Quanto mais ao código recém-gerado por IA, nem se fala sobre quebras de responsividade.

Automatizando testes de regressão com Playwright e Pixelmatch, você não precisa ficar reduzindo a janela do navegador manualmente para checar tudo.

  1. Instale as ferramentas de teste.
    bash npm install -D @playwright/test @axe-core/playwright

  2. Adicione um script que percorre as viewports de mobile (375px), tablet (768px) e desktop (1440px) tirando screenshots.

  3. Defina o limite de maxDiffPixelRatio em 0.02. Se ultrapassar esse valor, a imagem da diferença de pixels é reenviada para o prompt da IA para que ela reescreva as media queries.

Após rodar esse loop de testes de renderização, o tempo de inspeção manual da UI diminuiu mais de 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',
  }
);

});
}
`

Filtrando código estranho logo antes do commit

Por mais bem estruturado que seja o prompt, às vezes entra algum código lixo bizarro, assim como um ar-condicionado de IA falhando. É preciso impedir que códigos que quebram a tipagem ou não passam no lint logo antes do commit cheguem a entrar no seu espaço de trabalho do Git.

Configure os Git hooks com o Lefthook.

  1. Instale o Lefthook no projeto e crie o arquivo lefthook.yml na raiz.
    bash npm install -D lefthook

  2. Adicione os comandos de verificação do ESLint, Prettier e TypeScript na etapa de pre-commit.

  3. Ative a opção stage_fixed: true para que as alterações corrigidas automaticamente sejam aplicadas diretamente ao commit.

Se houver erros de tipo corrigidos ou Props apagadas sem autorização, o commit é interrompido imediatamente. É a maneira mais garantida de encerrar a ineficiência de ter um desenvolvedor atuando manualmente como revisor de código para limpar os resíduos deixados pela IA.

`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
`

관련 영상

Esta Habilidade Acabou de Tornar o Kimi K3 um Designer 10x Melhor

AI LABS15:15

커뮤니티의 다른 글

댓글

로그인하고 댓글을 남겨 보세요.

아직 댓글이 없습니다.