Menguji performa dari sisi client: Core Web Vitals (LCP, INP, CLS), Lighthouse audit, browser performance profiling, dan strategi optimasi frontend untuk user experience yang cepat dan stabil.

Setelah di episode 7 kita menguji API dan database performance dari sisi server, kini saatnya melihat performa dari perspektif yang sering terlupakan: sisi client. Frontend performance menentukan bagaimana user benar-benar mengalami aplikasi — bukan berapa lama server merespons, melainkan berapa lama user harus menunggu sampai bisa berinteraksi.
Google menggunakan Core Web Vitals sebagai ranking factor untuk SEO — yang berarti frontend performance bukan hanya soal user experience, tetapi juga soal visibilitas bisnis. Episode ini membawa kalian memahami metrik frontend, menjalankan audit, dan mengoptimasi performa dari sisi client.
Core Web Vitals adalah tiga metrik utama yang diukur Google untuk menentukan kualitas user experience di web. Di 2026, ketiga metrik ini menjadi standar industri.
LCP mengukur waktu yang dibutuhkan untuk menampilkan konten terbesar (biasanya hero image atau heading besar) di viewport. LCP adalah indikator utama loading performance.
INP mengukur latency dari interaksi user (klik, tap, keyboard) sampai visual update berikutnya. INP adalah indikator utama interactivity — menggantikan First Input Delay (FID) di 2024.
CLS mengukur seberapa banyak layout berpindah secara tidak terduga selama halaman dimuat. CLS adalah indikator utama visual stability — elemen yang berpindah saat user mencoba mengklik tombol adalah pengalaman yang menjengkelkan.
Google Lighthouse adalah tool audit web yang mengukur performance, accessibility, best practices, dan SEO. Lighthouse menghasilkan skor 0-100 dan rekomendasi spesifik untuk perbaikan.
# Install Lighthouse CLI
npm install -g lighthouse
# Jalankan audit
lighthouse https://example.com --output html --output-path report.htmlLighthouse memberikan metrik dan rekomendasi. Fokus pada:
Untuk mengintegrasikan Lighthouse ke CI/CD:
# Lighthouse CI config (lighthouserc.js)
module.exports = {
ci: {
collect: {
url: ['https://staging.example.com'],
numberOfRuns: 3,
},
assert: {
assertions: {
'categories:performance': ['error', { minScore: 0.9 }],
'largest-contentful-paint': ['error', { maxNumericValue: 2500 }],
},
},
},
};Performance panel di Chrome DevTools merekam seluruh aktivitas halaman: rendering, scripting, dan painting. Kalian bisa melihat:
Install ekstensi Web Vitals di Chrome untuk melihat LCP, INP, dan CLS secara real-time saat browsing. Ini membantu kalian memahami bagaimana setiap halaman berperforma dari perspektif user.
Lazy loading menunda loading resource yang tidak dibutuhkan segera — images di bawah fold, scripts yang belum dipakai. Ini mengurangi LCP dengan fokus pada konten yang terlihat pertama kali.
<!-- Lazy load images -->
<img src="hero.jpg" alt="Hero" />
<img src="below-fold.jpg" alt="Content" loading="lazy" />
<!-- Lazy load scripts -->
<script src="analytics.js" defer></script>Code splitting memecah JavaScript bundle menjadi chunk yang lebih kecil — user hanya mengunduh kode yang dibutuhkan untuk halaman yang sedang dikunjungi. Ini mengurangi Time to Interactive dan INP.
Images adalah penyebab terbesar LCP yang buruk. Optimasi:
srcset untuk mengirim ukuran yang tepat sesuai device<picture>
<source srcset="image.avif" type="image/avif" />
<source srcset="image.webp" type="image/webp" />
<img src="image.jpg" alt="Product" width="800" height="600" />
</picture>Browser caching yang baik mengurangi loading time untuk repeat visitors:
# Cache-Control header
Cache-Control: public, max-age=31536000, immutable # Static assets
Cache-Control: no-cache # HTML pagesk6 bisa menguji backend performance dari sisi server, tetapi untuk frontend performance kalian membutuhkan browser-based testing. k6 punya modul browser yang menjalankan browser automation:
import { browser } from 'k6/browser';
import { check } from 'k6';
export const options = {
scenarios: {
browser: {
executor: 'constant-vus',
vus: 10,
duration: '1m',
options: { browser: { type: 'chromium' } },
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto('https://example.com');
await page.waitForLoadState('networkidle');
const lcp = await page.evaluate(() => {
return new Promise((resolve) => {
new PerformanceObserver((list) => {
const entries = list.getEntries();
resolve(entries[entries.length - 1].startTime);
}).observe({ type: 'largest-contentful-paint', buffered: true });
});
});
check(null, { 'LCP < 2500ms': () => lcp < 2500 });
await page.close();
}Di episode 8 ini kalian telah memahami frontend & web performance:
Di episode 9 selanjutnya, kita akan membahas Monitoring & Metrics — bagaimana memantau performa selama load test menggunakan Grafana, Prometheus, dan observability tools lainnya. Siapkan stack monitoring kalian!