STATUS IS UPWIKI OPTIMASI SITUS WEB
25Percepat
Kinerja dan pengiriman / Percepat

Kinerja JavaScript: Kurangi Pekerjaan pada Main Thread

Temukan JavaScript yang membuat halaman tersendat, lalu tunda atau hapus pekerjaan yang tidak perlu, dan lindungi interaksi pengguna.

Kinerja JavaScript: Kurangi Pekerjaan pada Main Thread — PANDUAN VISUAL
BACA
8 menit
SUMBER
5
VALIDASI ULANG
2027-03-27
ditinjau
Reviewer Senior Kinerja Web
JAWABAN SINGKAT

Mulai dengan keputusan.

Kurangi pekerjaan pada main thread dengan mengukur halaman dan interaksi nyata, lalu perbaiki biaya terbesar yang dapat diulang. Main thread menjalankan sebagian besar JavaScript dan pekerjaan antarmuka satu tugas pada satu waktu. Tugas lebih dari 50 milidetik dianggap long task, sehingga ketukan, klik, gulir, atau paint dapat menunggu di belakangnya. Mulailah dengan checkout, pencarian, navigasi, formulir, dan perjalanan sensitif lainnya.

Untuk setiap biaya, hapus, tunda sampai diperlukan, bagi menjadi batch pendek, atau pindahkan komputasi terbatas ke Web Worker. Pertahankan respons langsung di main thread, tetapi tunda analitik dan tindak lanjut nonesensial. Perlakukan setiap tag pihak ketiga sebagai dependensi dengan pemilik. Uji ulang pada CPU ponsel yang dibatasi dan siapkan rollback untuk alur kritis.

PANDUAN VISUAL

Lihat pekerjaan sebagai sebuah sistem.

Gunakan peta ini untuk menghubungkan keputusan dalam artikel sebelum menerapkan taktik individual.

SIUPercepat
01Profilkan perjalanan pelanggan sebelum mengubah kode
02Baca trace sebagai antrean pekerjaan
03Kirim lebih sedikit kode pada saat yang tepat
04Pecah pekerjaan agar browser bisa merespons
01

Profilkan perjalanan pelanggan sebelum mengubah kode

Pilih satu rute dan interaksi penting, seperti membuka navigasi, memfilter hasil, atau mengirimkan formulir. Rekam di panel Performance Chrome DevTools dalam kondisi browser yang bersih. Ulangi tindakan tersebut dan ambil rekaman pada satu pengujian dengan CPU dibatasi serta satu pengujian di mesin pengembangan; jejak desktop dapat menyembunyikan pekerjaan yang mengganggu pada ponsel berkinerja lebih rendah.

Gunakan trace untuk menguji hipotesis sempit, bukan untuk menyalahkan komponen dari laporan bundel. Di Main flame chart, bar yang lebih lebar memakan waktu lebih lama dan bar bertumpuk menunjukkan call stack. Segitiga merah pada sebuah Task menunjukkan potensi long task; pilih itu dan ikuti tautan kode penginisiasi. Simpan trace sebelum-dan-sesudah untuk melihat perubahan yang berarti.

Tangkap momen

Rekam tepat sebelum aksi dan hentikan setelah hasil yang terlihat tercapai.

Gunakan kasus yang dapat diulang

Pertahankan rute, status akun, dan urutan aksi konsisten.

Tetapkan pemilik

Tugaskan setiap biaya teratas ke tim atau vendor yang dapat mengubahnya.

02

Baca trace sebagai antrean pekerjaan

Long task adalah ambang penyelidikan, bukan diagnosis lengkap. Spesifikasi W3C Long Tasks melaporkan tugas yang berlangsung 50 milidetik atau lebih. Lihat di bawah tugas untuk evaluasi JavaScript, event handler, perhitungan gaya, layout, atau paint. Call stack menunjukkan titik awal; linimasa menunjukkan apakah masalah berasal dari kode, rendering, atau frame pihak ketiga.

Prioritaskan biaya yang berulang selama interaksi bernilai. Handler pendek masih bisa terasa lambat jika memicu layout atau menunggu di belakang pekerjaan sebelumnya. Trace adalah pengukuran laboratorium, jadi konfirmasi perbaikan pada perangkat representatif dan, bila tersedia, dengan telemetri lapangan yang menjaga privasi.

Pisahkan momen

Parsing saat startup memerlukan solusi berbeda dari handler setelah ketukan.

Periksa rendering

Temukan pola berulang ketika gaya ditulis lalu layout dibaca sebelum melakukan refaktor.

Simpan baseline

Lampirkan trace, skenario, dan biaya teratas ke item pekerjaan.

03

Kirim lebih sedikit kode pada saat yang tepat

Buat inventaris skrip berdasarkan rute dan tujuan. Hapus paket yang tidak terpakai, duplikat, eksperimen yang dihentikan, dan kode untuk fitur yang berakhir. Kemudian pisahkan fitur spesifik-rute atau yang jarang dipakai sehingga dimuat ketika diperlukan bukan di jalur awal. Pemecahan dinamis dapat mengurangi pekerjaan startup, tetapi dapat menciptakan jeda terlihat saat pengguna membutuhkan fitur segera.

Tanyakan apakah sebuah komponen membutuhkan framework sisi-klien penuh, apakah sebuah utilitas menggandakan kemampuan yang sudah ada, dan apakah HTML statis plus peningkatan kecil akan bekerja. Uji keadaan fallback modul yang ditunda. Halaman harus menunda kemampuan opsional secara anggun daripada menampilkan kontrol yang mati.

Buat anggaran rute

Dokumentasikan skrip mana yang diizinkan pada sebuah rute dan mengapa.

Muat berdasarkan intent

Pertimbangkan ini untuk editor opsional, peta, pemutar, atau tampilan pelaporan.

Lindungi jalur kritis

Uji autentikasi, aksesibilitas, pembayaran, dan penyelesaian formulir; minta tinjauan berkualifikasi ketika kontrol terpengaruh.

04

Pecah pekerjaan agar browser bisa merespons

Memberi nama fungsi kecil tidak membuatnya menjadi tugas browser terpisah ketika dijalankan secara sinkron. Untuk loop panjang, batch pekerjaan, perbarui status yang terlihat pengguna segera, lalu beri kesempatan (yield) sebelum melanjutkan. Itu memungkinkan browser memproses input dan rendering antar-batch.

Pada browser yang mendukungnya, scheduler.yield() mengembalikan kontrol kepada main thread lalu melanjutkan pekerjaan; lakukan deteksi fitur ini dan gunakan fallback untuk browser yang tidak mendukungnya. Jangan memberi kesempatan setelah setiap operasi kecil: ada overhead dan waktu penyelesaian dapat bertambah. Pilih batas berdasarkan pengukuran, pertahankan kemampuan pembatalan, dan cegah hasil usang menggantikan status yang lebih baru.

Utamakan UI

Tampilkan tanda terima atau progres sebelum tindak lanjut yang tidak terlihat.

Batch berdasarkan waktu yang berlalu

Beri kesempatan sebelum pekerjaan terukur menjadi panjang, bukan sekali per item.

Hindari jalan pintas usang

Panduan web.dev saat ini tidak merekomendasikan strategi baru berbasis isInputPending().

05

Pindahkan komputasi, bukan antarmuka, ke worker

Web Worker menjalankan skrip di thread latar yang terpisah dari thread eksekusi utama. Ini cocok untuk parsing mahal, transformasi data, pengindeksan pencarian, dan komputasi lain yang tidak memerlukan akses langsung ke antarmuka. Kirim input yang terdefinisi, kembalikan hasil yang terdefinisi, dan pertahankan rendering serta perubahan status terlihat di main thread.

Worker tidak selalu cocok. Worker tidak dapat memanipulasi DOM secara langsung atau menggunakan Window, dan komunikasi pesan biasanya menyalin data. Pembuatan worker, pemindahan data, dan koordinasi kesalahan dapat mengalahkan manfaat untuk perhitungan kecil. Ukur keseluruhan interaksi, hentikan worker yang tidak diperlukan, dan rancang fallback jika pekerjaan worker gagal.

Pilih pekerjaan terisolasi

Mulai dengan perhitungan yang input dan outputnya bisa diserialisasi dan diuji.

Versi pesan

Buang hasil yang dibuat untuk filter, rute, atau aksi yang lebih lama.

Pertahankan aksesibilitas

Sampaikan progres bermakna melalui antarmuka normal.

06

Kelola JavaScript pihak ketiga sebagai dependensi produksi

Analitik, periklanan, eksperimen, embed sosial, pemutar video, dan widget dukungan dapat menambah permintaan, evaluasi JavaScript, iframe, dan dependensi. Skrip vendor mungkin diperlukan, tetapi berada di luar kontrol langsung tim aplikasi dan dapat memengaruhi kinerja, privasi, keamanan, dan kontinuitas. Inventarisasikan tujuannya, rute, kondisi pemuatan, pihak yang menyetujui, persyaratan persetujuan, dan pemilik penghapusan.

Di mana kondisi dan kontrak memungkinkan, bandingkan halaman representatif dengan dan tanpa satu origin pihak ketiga. Alat performa dapat mengekspos evaluasi mahal, payload, dan atribusi long-task. Pertahankan integrasi ringan atau ditunda hanya ketika nilai yang terdokumentasi membenarkan biaya yang terukur. Konfirmasikan konten inti dan pekerjaan transaksi utama ketika dependensi opsional lambat atau tidak ada.

Batasi radius dampak

Muat tag hanya pada rute dan kondisi yang membutuhkannya.

Tinjau kontrol perubahan

Sertakan perubahan tag-manager dalam tinjauan kinerja, privasi, keamanan, dan rollback.

Sediakan sakelar penghapusan

Dokumentasikan dan uji cara menonaktifkan integrasi nonkritis.

07

Jadikan responsivitas sebagai pengaman rilis

Jadikan trace yang menunjukkan perbaikan sebagai pemeriksaan regresi kecil untuk perjalanan penting. Definisikan interaksi yang dicakup, batas perangkat atau CPU, respons yang diharapkan, dan reviewer. Padukan ini dengan tinjauan inventaris bundel dan pihak ketiga agar paket atau tag baru tidak diam-diam memperkenalkan kembali pekerjaan main thread.

Status Is UP menggunakan bukti ini untuk optimisasi proaktif dan remediasi aman, bukan untuk menggantikan pemantauan ketersediaan langsung. Sebelum perubahan berisiko tinggi, siapkan rollback dan verifikasi alur kritis setelah rilis. Hasil bervariasi menurut perangkat, jaringan, browser, konten, dan status akun; anggap ambang sebagai batas pengaman, bukan jaminan.

Gerbangkan perubahan signifikan

Minta trace sebelum-dan-sesudah untuk navigasi bersama, checkout, pencarian, atau bundel besar.

Latihan rollback

Ketahui feature flag, pengaturan tag, atau versi deployment yang mengembalikan perilaku yang diketahui baik.

Kunjungi kembali secara berkala

Profil ulang setelah rilis besar, perubahan vendor, atau pergeseran campuran perangkat.

TINDAKAN / VERIFIKASI

Panduan tugas praktis Anda.

  1. 01

    Pilih interaksi kritis

    Tentukan rute, aksi, respons yang diharapkan, dan dampak pelanggan.

    VERIFIKASI: Catatan pengujian merekam rute, status akun, aksi, browser, dan pengaturan perangkat atau CPU.
  2. 02

    Rekam baseline

    Rekam interaksi di DevTools Performance dari kondisi bersih.

    VERIFIKASI: Tim dapat mengunjungi kembali trace dengan Main flame chart.
  3. 03

    Temukan pekerjaan yang memblokir

    Periksa long tasks, call stack, rendering, dan aktivitas pihak ketiga.

    VERIFIKASI: Setiap biaya teratas memiliki durasi, sumber atau origin, rute, dan pemilik.
  4. 04

    Hapus skrip yang tidak perlu

    Hapus paket tidak terpakai, eksperimen yang dihentikan, duplikat, dan kode rute yang tidak diperlukan.

    VERIFIKASI: Build dan perjalanan kritis bekerja setelah penghapusan.
  5. 05

    Tunda fitur opsional

    Tunda pemuatan kapabilitas opsional hanya jika pengguna tetap dapat menggunakan halaman saat kapabilitas itu belum tersedia.

    VERIFIKASI: Uji halaman baru mencakup pemuatan, kegagalan, atau fallback.
  6. 06

    Pecah long task

    Batch pekerjaan dan beri kesempatan setelah respons antarmuka langsung.

    VERIFIKASI: Trace baru tidak lagi menunjukkan long task pada jalur interaksi yang sebanding dan tetap menghasilkan keluaran yang benar.
  7. 07

    Evaluasi worker

    Pindahkan hanya komputasi terbatas dengan pesan yang terdefinisi.

    VERIFIKASI: Uji timing end-to-end, kesalahan, hasil usang, dan pembersihan.
  8. 08

    Audit pihak ketiga

    Catat tujuan, pemilik, kondisi, persetujuan, biaya, dan prosedur penonaktifan.

    VERIFIKASI: Setiap tag rute kritis memiliki keputusan simpan, batasi, tunda, atau hapus.
  9. 09

    Uji kondisi terbatas

    Ulangi pada CPU yang dibatasi dan browser atau perangkat representatif bila memungkinkan.

    VERIFIKASI: Perbandingan menggunakan skenario yang sama dan mencatat perbedaan material.
  10. 10

    Rilis dengan rollback

    Lampirkan trace, pemeriksaan penerimaan, dan instruksi pembalikan ke rilis.

    VERIFIKASI: Pemilik bernama dapat mengembalikan perilaku yang diketahui baik tanpa harus mencari-cari instruksi yang tidak terdokumentasi.
TOPIK DISKUSI

Bandingkan kompromi, bukan data pribadi.

Gunakan prompt ini dengan tim Anda atau komunitas pemilik situs. Bagikan metode dan pelajaran, tetapi jangan pernah menempelkan kredensial, data pelanggan, atau detail infrastruktur yang tidak bersifat publik.

  1. 01

    Interaksi mana yang terlihat dapat diterima dalam laporan pemuatan namun terbukti lambat ketika Anda memprofil tindakan ketukan atau klik nyata?

  2. 02

    Bagaimana Anda memutuskan apakah fitur pihak ketiga membenarkan biaya main-thread yang terukur?

  3. 03

    Mekanisme rollback mana yang membuat pembalikan regresi kinerja paling mudah tanpa mengganggu perjalanan kritis?

SUMBER POPULER / TERPERCAYA

Buka materi sumber.

web.devOptimize long tasks ↗

Menjelaskan long tasks, yielding, scheduler.yield(), fallback, dan overhead yield.

Ditinjau 2026-09-27
Chrome for DevelopersAnalyze runtime performance ↗

Menunjukkan cara merekam, menganalisis flame chart, mengidentifikasi long task, dan menyelidiki sumber.

Ditinjau 2026-09-27
MDN Web DocsWeb Workers API ↗

Mendefinisikan workers, komunikasi pesan, dan batasan akses langsung ke DOM.

Ditinjau 2026-09-27
web.devLoad Third-Party JavaScript ↗

Memberi panduan audit dan pengukuran skrip pihak ketiga.

Ditinjau 2026-09-27
W3CLong Tasks API ↗

Mendefinisikan long tasks, ambang batas, dan atribusi.

Ditinjau 2026-09-27

Kebijakan sumber. Artikel ini menggunakan dokumentasi resmi browser, standar, dan web-platform yang dibaca tim editorial. Ini membedakan pengukuran dari jaminan dan menghilangkan klaim yang tidak didukung.

PENJELASAN SINGKAT

Pertanyaan umum.

Apa yang dihitung sebagai long JavaScript task?

Spesifikasi W3C Long Tasks menggunakan 50 milidetik atau lebih sebagai ambang pelaporan. Itu adalah sinyal untuk diselidiki, bukan bukti bahwa tugas lebih pendek aman. Konfirmasi penyebabnya dalam trace.

Apakah code splitting selalu meningkatkan kinerja JavaScript?

Tidak. Pemecahan dapat mengurangi pekerjaan startup tetapi menambah keterlambatan pada penggunaan pertama. Gunakan untuk kode spesifik-rute atau opsional, lalu uji fitur itu di kondisi terbatas.

Haruskah setiap fungsi mahal dijalankan di Web Worker?

Tidak. Worker sesuai untuk komputasi CPU-intensif yang terisolasi dengan pesan terdefinisi. Mereka tidak dapat langsung mengubah DOM, biaya transfer data memakan waktu, dan tugas kecil mungkin selesai lebih cepat di main thread.

Status Is UP Editorial Team · Editor Pemberdayaan Ketersediaan

Ditinjau oleh Reviewer Senior Kinerja Web. Diterbitkan 2026-09-27; diperbarui 2026-09-30.