Episode ini membahas optimasi performa CSS Tailwind: konfigurasi content yang efisien untuk JIT, teknik critical CSS dan split CSS untuk mengurangi render-blocking, serta menganalisis ukuran bundle dengan source-map-explorer dan analyzer lain.

Tailwind secara default sudah hemat: JIT hanya membangkitkan kelas yang terpakai. Tapi di project besar, kualitas konfigurasi content dan strategi penyajian tetap menentukan. Episode 14 membahas optimasi performa: content yang efisien, critical CSS, split CSS, dan analisis ukuran bundle.
Setiap kilobyte CSS menunda first render. Tujuan kita: memastikan CSS yang dikirim hanya yang dibutuhkan halaman itu, pada waktu yang tepat, dan bisa diukur seiring waktu agar tidak membengkak diam-diam.
JIT memindai file di content dan membangkitkan setiap kelas yang ditemukan. Content yang terlalu luas — misalnya memasukkan node_modules atau seluruh repo — memperlambat build dan bisa menghasilkan kelas yang tidak diinginkan. Sempitkan selalu:
module.exports = {
content: [
"./index.html",
"./src/**/*.{html,js,ts,jsx,tsx}",
"./src/**/*.{vue,svelte,astro}",
],
};Satu sumber nama kelas saja sudah cukup. Jangan memasukkan file dist atau node_modules:
node_modules/** -> jangan
dist/** -> jangan
src/**/*.map -> janganPola glob ./src/**/*.{html,js,ts,jsx,tsx} adalah contoh yang baik: sempit, jelas, dan mencakup semua file yang berisi markup.
CSS di atas fold ditampilkan lebih dulu agar first paint cepat. Pendekatan umum: inline critical CSS di <head> dan muat sisanya secara async:
<style>/* critical CSS yang di-inline */</style>
<link rel="stylesheet" href="/css/rest.css" media="print" onload="this.media='all'" />media="print" mencegah browser memblokir render untuk file yang belum dibutuhkan, lalu onload menggantinya menjadi all saat selesai dimuat. Ini mengurangi render-blocking secara drastis.
Untuk SPA atau multi-page, pisahkan CSS per route/bundle. Utility yang hanya dipakai di halaman admin tidak perlu dikirim ke halaman publik. Di framework seperti Next.js, CSS yang di-import per halaman otomatis dipisahkan; di project tanpa framework, jalankan build terpisah:
npx tailwindcss -i src/styles.css -o dist/public.css --content ./public/**/*.html
npx tailwindcss -i src/admin.css -o dist/admin.css --content ./admin/**/*.htmlSetiap halaman hanya menerima CSS untuk kelas yang benar-benar digunakannya.
Ukuran yang tidak diukur tidak bisa dioptimasi. Alat bantu analisis:
--analyze bawaan Tailwind untuk melihat utilitas apa yang paling banyak berkontribusi.@next/bundle-analyzer untuk framework.Contoh memakai flag analyze:
npx tailwindcss -i src/styles.css -o dist/output.css --analyzeOutput-nya menampilkan utility dengan ukuran terbesar — biasanya karena kombinasi variants seperti hover:, md:, dan dark: yang melipatgandakan deklarasi.
Tip
Waspadai utility yang dihasilkan dalam jumlah besar karena kombinasi variants. Satu text-xs di markup bisa menjadi puluhan baris CSS setelah dikalikan dengan variants dan breakpoint. Batasi variants yang benar-benar dipakai.
Optimasi bukan acara sekali jalan. Setiap fitur baru berpotensi menambah utility, variants, atau arbitrary values yang tidak pernah dibayangkan saat konfigurasi pertama ditulis. Karena itu, jadikan pengukuran bagian dari workflow, bukan pengecualian yang dilakukan menjelang rilis.
Beberapa kebiasaan yang menjaga CSS tetap ramping di project yang tumbuh:
--analyze secara berkala, misalnya setiap rilis, lalu catat ukuran output sebagai baseline yang bisa dibandingkan antar versi.Dengan pengukuran yang rutin, pertumbuhan CSS menjadi keputusan sadar, bukan akumulasi tak terlihat. Tim tahu kapan harus merapikan utility lama, kapan utility baru layak ditambahkan, dan kapan split CSS perlu dirombak ulang karena pola pemakaian berubah. Setiap kali tim berhasil memangkas ukuran, catat alasannya agar kebiasaan baik itu bisa ditiru di area lain.
Sebagai pegangan, target yang sehat adalah CSS total tetap di bawah ambang budget dan halaman tidak menunggu stylesheet besar sebelum first render.
Kedua angka itu bisa dipantau otomatis; begitu pemantauan berjalan, optimasi bukan lagi tebakan melainkan keputusan berbasis data.
Episode 14 mempertajam performa: content yang sempit membuat JIT efisien, critical CSS dan split CSS mengurangi render-blocking, dan alat analisis membuat pertumbuhan ukuran tetap terpantau.
Inti yang harus dibawa pulang:
content ke file yang benar-benar memuat nama kelas.node_modules atau direktori build di content.--analyze bawaan menampilkan utility terbesar di output.Di episode 15 selanjutnya kita akan membahas component API patterns — pengenalan class-variance-authority untuk komponen berbasis variants, pola utility wrapper memakai clsx dan tailwind-merge, serta pengujian output class dalam unit test.