Saat melihat video demonstrasi alat AI, hanya dengan menekan beberapa tombol dan mengetik beberapa kalimat, UI yang luar biasa dapat tercipta. Masalahnya adalah realitas. Saat kode yang dihasilkan oleh AI dibawa ke dalam proyek yang sudah ada, gaya visual akan berantakan dan manajemen status (state) menjadi kacau. Mengedit dan memperbaiki hal ini secara manual justru sering kali menghabiskan waktu pengembangan dua kali lebih banyak, pengalaman yang mungkin pernah dialami oleh sebagian besar dari kita.
Pada akhirnya, agar dapat menggunakan kode AI secara langsung, kita harus mengikat analisis statis, strukturisasi status, dan verifikasi visual ke dalam pagar pembatas (guardrail) terotomatisasi. Berikut adalah cara pengaturan konkrit agar kode dapat langsung siap digunakan tanpa harus bergadang untuk memperbaikinya.
Menyingkirkan Kelas Tailwind Sembarangan dan Gaya Inline
Bahkan saat AI memahami konteks dengan baik, terkadang AI secara tiba-tiba mengabaikan token proyek. AI dapat secara sembarangan memasukkan nilai acak di dalam kurung siku seperti w-[327px] atau gaya inline dengan kode heksadesimal. Sistem desain akan langsung hancur dan prioritas CSS menjadi kacau.
Jika manusia mencarinya dengan mata telanjang dan memperbaikinya, itu sudah terlambat. Kita harus membendungnya di pintu masuk menggunakan Linter.
Pasang paket yang dibutuhkan pada proyek.
bash npm install -D eslint-plugin-tailwindcss @html-eslint/eslint-pluginMasukkan aturan pada berkas
eslint.config.mjsuntuk menangkap nilai acak dalam kurung siku dan gaya inline sebagai eror.Daftarkan
npx eslint --fixpada skrip Package dan jalankan segera setelah menerima kode.
Jika disusun seperti ini, begitu nilai dalam kurung siku atau gaya inline masuk, linter akan mengeluarkannya sebagai eror dan secara paksa menggantinya dengan kelas utilitas standar terdekat. Seiring hilangnya pekerjaan tidak penting ini, waktu yang digunakan untuk menyelaraskan gaya dapat dihemat lebih dari 5 jam per minggu.
`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",
},
},
]);
`
| Aturan Linting | Metode Pemeriksaan | Contoh Target Pemblokiran | Hasil Koreksi Otomatis |
|---|---|---|---|
| @html-eslint/no-inline-styles | Memblokir gaya inline JSX | <div style={{color: '#ff0a00'}}> |
<div className="text-destructive"> |
| tailwindcss/no-arbitrary-value | Memblokir nilai acak dalam kurung siku | <button className="w-[327px]"> |
<button className="w-80"> |
| tailwindcss/no-custom-classname | Mendeteksi nama kelas yang tidak terdaftar | <div className="my-custom-card"> |
<div className="rounded-lg border bg-card shadow-sm"> |
Merapikan useState yang Berserakan di Dalam Komponen
Saat meminta AI untuk membuat komponen React, sembilan dari sepuluh AI akan menyebarkan tiga atau empat useState di dalam satu berkas. Jika panggilan API asinkron dan penanganan eror saling bercampur di dalamnya, ledakan rendering akan terjadi.
Status UI klien harus dikumpulkan dengan Zustand, dan data server harus dipisahkan dengan React Query. Untuk formulir input, gunakan kombinasi Zod dan react-hook-form untuk mengunci kerangkanya.
Pasang pustaka dependensi.
bash npm install @tanstack/react-query zod react-hook-form @hookform/resolversLarang penggunaan langsung
fetchpada skema perintah (prompt) AI dan instruksikan untuk mendefinisikan tipe terlebih dahulu menggunakan skema Zod.Hubungkan
zodResolverkereact-hook-formuntuk mengotomatisasi verifikasi, lalu atur strukturnya agar memanggiluseMutationpada saat pengiriman (submit).
Re-render yang tidak perlu akan sepenuhnya hilang. Kegagalan validasi nilai input bahkan tidak akan bisa masuk sampai ke dalam komponen.
`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 (
{/* 폼 레이아웃 */}
);
}
`
| Area | Anti-pattern AI | Struktur Terrefaktorisasi | Keuntungan |
|---|---|---|---|
| Status Klien | useState terfragmentasi | Store tunggal Zustand | Mencegah re-render yang tidak perlu |
| Data Server | fetch di dalam useEffect | Pembungkus (wrapping) React Query | Caching otomatis & penanganan loading deklaratif |
| Validasi Formulir | Pemeriksaan kondisi manual | Zod + react-hook-form | Keamanan tipe & otomatisasi validasi |
Siklus Pengujian untuk Menangkap Layar Rusak Secara Visual
Hanya melihat satu layar desktop lalu berkata "Wah, tampilannya bagus" sering kali berakhir dengan tata letak yang berantakan saat dibuka di ponsel pintar. Menurut laporan aksesibilitas web WebAIM tahun 2025, hanya di halaman utama 1 juta situs teratas saja ditemukan rata-rata lebih dari 51 kesalahan WCAG. Terlebih lagi, kerusakan responsif pada kode yang baru saja dihasilkan oleh AI tidak perlu diragukan lagi.
Dengan mengotomatisasi pengujian regresi menggunakan Playwright dan Pixelmatch, Anda tidak perlu lagi mengecilkan jendela peramban satu per satu untuk memeriksanya.
Pasang alat pengujian.
bash npm install -D @playwright/test @axe-core/playwrightTambahkan skrip yang mengambil tangkapan layar (snapshot) saat berganti antartampilan (viewport) seluler (375px), tablet (768px), dan desktop (1440px).
Tetapkan ambang batas
maxDiffPixelRatiopada angka 0.02. Jika melebihi angka ini, gambar perbedaan piksel akan dikirim kembali ke perintah AI agar AI menulis ulang kueri media (media query).
Setelah menjalankan siklus pengujian rendering ini, waktu inspeksi UI secara manual berkurang lebih dari 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',
}
);
});
}
`
Menyaring Kode Aneh Tepat Sebelum Commit
Sebagus apa pun perintah disusun, terkadang kode sampah yang aneh tetap bisa masuk seperti gangguan pada AC AI. Kode yang merusak tipe atau tidak lolos lint tepat sebelum commit harus dicegah agar tidak bisa masuk ke dalam ruang kerja Git.
Atur Git hooks menggunakan Lefthook.
Pasang Lefthook pada proyek dan buat berkas
lefthook.ymldi direktori akar (root).bash npm install -D lefthookTautkan perintah pemeriksaan ESLint, Prettier, dan TypeScript pada tahap
pre-commit.Aktifkan opsi
stage_fixed: trueagar riwayat yang diperbaiki secara otomatis langsung tercermin pada commit.
Jika ada kesalahan tipe yang diperbaiki atau Props yang dihapus secara tidak sah, commit akan dibatalkan seketika. Ini adalah cara paling pasti untuk mengakhiri ketidakefisienan pengembang yang harus bertindak sebagai peninjau kode manual untuk membersihkan sisa-sisa kesalahan AI.
`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
`
