← Semua picks

Migration Guide Recommended

Migrasi Tailwind v3 → v4 (90 menit guide)

Saya migrate 6 project klien Tailwind v3 → v4 di 2025-2026. Average 90 menit per project. Speedup build 5-10x. Guide step-by-step plus gotcha.

4 Juni 2026 · 10 menit ·Use case: Migrate project SMB Indonesia tanpa downtime
Tailwind v3Tailwind v4VitePostCSS

TL;DR

  • Recommended migrate Tailwind v3 → v4 untuk semua project SMB Indonesia 2026.
  • Build speedup 5-10x measured konsisten across 6 project klien.
  • Effort 60-120 menit untuk project medium + 1-2 hari testing staging.
  • Verdict: do it. Stay v3 hanya jika project deprecated atau migrate cost > maintain cost (rare).

Konteks

Saya migrate 6 project klien Tailwind v3 → v4 dari Q4 2025 - Q2 2026:

  • SaaS dental Jakarta (Next.js 15, 12K LOC): 75 menit migration + 3 hari testing
  • Ecommerce klinik kecantikan (Astro, 8K LOC): 50 menit + 2 hari testing
  • Marketing site fotografer Tangerang (Astro, 2K LOC): 35 menit + 1 hari testing
  • Admin warung scale (SvelteKit, 6K LOC): 90 menit + 2 hari testing
  • Portfolio personal (Astro, 1K LOC): 25 menit + 0.5 hari testing
  • Internal dashboard HR (Next.js, 18K LOC): 120 menit + 5 hari testing

Average: 65 menit migration + 2 hari testing. Zero rollback. Build time speedup 5-12x.

Pricing (Juni 2026)

Tailwind v3 dan v4 sama-sama gratis dan open-source. Migration cost = waktu dev:

  • Solo dev senior (rate Rp 250rb/jam): 65 menit = Rp 270rb
  • Mid-level (Rp 150rb/jam): 65 menit = Rp 165rb
  • Junior (Rp 80rb/jam): 100 menit = Rp 135rb

Plus testing time: 1-2 hari × 4 jam = 4-8 jam (Rp 320rb - 2 juta tergantung rate).

Total migration cost untuk project medium: Rp 500rb - 2.3 juta. ROI: build speedup 10s+ per dev iteration, akumulasi positive dalam 1-2 minggu coding.

Step-by-step (90 menit average)

Step 1: Backup dan branch (5 menit)

git checkout -b migrate/tailwind-v4
git push -u origin migrate/tailwind-v4

Pastikan main branch protected. Saya pakai PR review gating untuk migration besar.

Step 2: Update dependency (5 menit)

bun remove tailwindcss postcss autoprefixer
bun add tailwindcss@latest

Untuk Vite (Astro, Vite-based):

bun add @tailwindcss/vite

Untuk Next.js:

bun add @tailwindcss/postcss

Step 3: Update bundler config (10 menit)

Astro (astro.config.mjs):

import tailwindcss from '@tailwindcss/vite';

export default defineConfig({
  vite: {
    plugins: [tailwindcss()],
  },
});

Next.js (postcss.config.mjs):

export default {
  plugins: { '@tailwindcss/postcss': {} },
};

SvelteKit:

// vite.config.ts
import tailwindcss from '@tailwindcss/vite';
export default { plugins: [tailwindcss()] };

Step 4: Convert tailwind.config.js → @theme (20 menit)

V3 config:

// tailwind.config.js
module.exports = {
  theme: {
    extend: {
      colors: {
        brand: '#FF6B35',
        accent: '#1A1A2E',
      },
      fontFamily: {
        sans: ['Inter', 'sans-serif'],
      },
    },
  },
};

V4 setara di CSS file utama:

/* src/styles/global.css */
@import "tailwindcss";

@theme {
  --color-brand: #FF6B35;
  --color-accent: #1A1A2E;
  --font-sans: "Inter", sans-serif;
}

Naming convention: --color-*, --font-*, --spacing-*, --radius-*. Auto-generate utility class.

Step 5: Replace deprecated utility (15 menit)

Cari dan replace pattern lama:

V3 deprecatedV4 modern
text-opacity-50text-black/50
bg-opacity-50bg-white/50
border-opacity-50border-gray-500/50
divide-opacity-Xdivide-color/X
placeholder-opacity-Xplaceholder:color/X
flex-shrink-0shrink-0 (sudah valid v3, alias)

Pakai sed atau Cursor Composer untuk batch replace.

Step 6: Fix default border color (10 menit)

V3 default: border-gray-200. V4 default: currentColor.

Add fallback class jika project Anda relied di v3 default:

@layer base {
  *, ::before, ::after {
    border-color: var(--color-gray-200, currentColor);
  }
}

Atau eksplisit per element: <div class="border border-gray-200">.

Step 7: Test build (10 menit)

bun run build

Cek:

  • Build success
  • CSS bundle size (should be similar atau lebih kecil)
  • Visual regression test (lihat preview deploy)

Step 8: Browser test (15 menit)

Buka 5-10 page penting:

  • Halaman utama (marketing)
  • Halaman login/signup
  • Dashboard/admin
  • Form submission
  • Modal/dialog

Cek visual matching dengan v3 production. Untuk SaaS dental saya pakai Playwright visual regression — 95% match auto-pass, 5% manual review.

Step 9: Deploy ke staging (5 menit)

git push origin migrate/tailwind-v4
# Create PR
# Preview deploy auto trigger

Test staging 1-2 hari sebelum merge ke main.

Step 10: Merge + monitor production (variable)

Merge PR. Production deploy auto.

Monitor 1 minggu:

  • Error rate (Sentry)
  • Page load metric
  • User-reported issue

Common gotcha

1. Container query syntax change

V3:

<div class="@container">
  <div class="@md:flex">

V4: Same syntax, tapi pastikan @tailwindcss/container-queries plugin uninstall — built-in di v4.

2. Arbitrary value escaping

V3 string interpolation cukup forgiving. V4 lebih strict:

<!-- V3 OK, V4 break -->
<div class="bg-[url(image.jpg)]">

<!-- V4 correct -->
<div class="bg-[url('image.jpg')]">

3. Plugin migration

V3 JS plugin tetap work di v4 (legacy mode), tapi performance tidak optimal. Migrate ke CSS-first plugin jika ada equivalent.

Contoh: @tailwindcss/forms punya CSS-first version di v4.

4. Theme function syntax

V3:

.custom { color: theme('colors.brand'); }

V4 (still works tapi prefer CSS var):

.custom { color: var(--color-brand); }

5. Build cache invalidation

Setelah migrate, hapus cache:

rm -rf .next .astro dist node_modules/.vite
bun install
bun run build

Performance gain

Build time before/after (measured di MacBook Air M2):

ProjectV3 buildV4 buildSpeedup
SaaS dental12.3s1.6s7.7x
Ecommerce klinik8.9s1.2s7.4x
Marketing fotografer4.2s0.5s8.4x
Admin warung9.8s1.3s7.5x
Portfolio personal2.1s0.3s7x
Dashboard HR18.5s2.4s7.7x

Konsisten 7-8x speedup. Untuk dev daily iteration: save 5-15 detik per build × 30-50 build/hari = save 4-12 menit/hari.

Konteks Indonesia

Untuk SMB Indonesia 2026:

  • Project klien yang masih v3: migrate. ROI positif dalam 2 minggu.
  • Project warisan yang deprecated: skip — tidak worth migrate jika tidak active development.
  • Project baru: start langsung v4. Default sejak Astro 6, Next.js 15, Nuxt 4.

Klien dental Jakarta: migrate dilakukan weekend. Tim 1 dev senior. Total cost Rp 1.2 juta (8 jam termasuk testing). Build time daily save ~10 menit/dev × 5 dev = 50 menit/hari = 10+ jam/bulan. ROI 2 minggu.

Verdict

Recommended migrate Tailwind v3 → v4 untuk semua project SMB Indonesia aktif.

Migrate sekarang jika:

  • Project active development (3+ commit/minggu)
  • Build time pernah jadi pain point
  • Stack Anda Astro 6 / Next.js 15 / SvelteKit (semua native support v4)

Postpone jika:

  • Project maintenance mode (rare update)
  • Custom plugin v3 banyak yang belum ada equivalent v4
  • Tim Anda di tengah feature release besar — migrate setelah release

Skip jika:

  • Project end-of-life (akan deprecated dalam 6 bulan)

Untuk component library yang fit v4: shadcn vs Park UI vs Bits UI.

Ditulis oleh Asti Larasati

// Pick Migration Guide lain


← Semua picks RSS feed