Tutorial ini mengajarkan Anda alur kerja dasar untuk men-debug masalah JavaScript di DevTools. Baca lanjutan, atau tonton video dari tutorial ini.
Mereproduksi bug
Menemukan serangkaian tindakan yang secara konsisten mengulangi kemunculan bug selalu menjadi langkah pertama untuk proses debug.
- Buka demo ini di tab baru.
- Masukkan
5
di kotak Nomor 1. - Masukkan
1
di kotak Nomor 2. - Klik Tambahkan Nomor 1 dan Nomor 2. Label di bawah tombol bertuliskan
5 + 1 = 51
. Hasilnya harus6
. Inilah bug yang akan Anda perbaiki.
Dalam contoh ini, hasil 5 + 1 adalah 51. Seharusnya 6.
Memahami UI panel Sumber
DevTools menyediakan banyak alat berbeda untuk tugas yang berbeda, seperti mengubah CSS, membuat profil performa pemuatan halaman, dan memantau permintaan jaringan. Panel Sumber adalah tempat Anda men-debug JavaScript.
Buka DevTools dan buka panel Sources.
Panel Sumber memiliki tiga bagian:
- Tab Halaman dengan hierarki file. Setiap file yang diminta oleh halaman tercantum di sini.
- Bagian Code Editor. Setelah memilih file di tab Halaman, isi file tersebut akan ditampilkan di sini.
Bagian Debugger. Beragam alat untuk memeriksa JavaScript halaman.
Jika jendela DevTools Anda lebar, secara default, Debugger berada di sebelah kanan Editor Kode. Dalam hal ini, tab Cakupan dan Pantau bergabung dengan Titik henti sementara, Stack panggilan, dan lainnya sebagai bagian yang dapat diciutkan.
Menjeda kode dengan titik henti sementara
Metode umum untuk melakukan debug pada masalah seperti ini adalah menyisipkan banyak pernyataan console.log()
ke dalam kode, untuk memeriksa nilai saat skrip dieksekusi. Contoh:
function updateLabel() {
var addend1 = getNumber1();
console.log('addend1:', addend1);
var addend2 = getNumber2();
console.log('addend2:', addend2);
var sum = addend1 + addend2;
console.log('sum:', sum);
label.textContent = addend1 + ' + ' + addend2 + ' = ' + sum;
}
Metode console.log()
mungkin dapat menyelesaikan tugas tersebut, tetapi titik henti sementara dapat menyelesaikannya lebih cepat. Breakpoint memungkinkan Anda menjeda kode di tengah eksekusi, dan memeriksa semua nilai pada saat itu. Titik henti sementara memiliki beberapa keunggulan dibandingkan metode console.log()
:
- Dengan
console.log()
, Anda perlu membuka kode sumber secara manual, menemukan kode yang relevan, menyisipkan pernyataanconsole.log()
, lalu memuat ulang halaman untuk melihat pesan di Konsol. Dengan titik henti sementara, Anda dapat menjeda kode yang relevan tanpa perlu mengetahui cara kode terstruktur. - Dalam pernyataan
console.log()
, Anda harus secara eksplisit menentukan setiap nilai yang ingin Anda periksa. Dengan titik henti sementara, DevTools menunjukkan nilai semua variabel pada saat itu. Terkadang ada variabel yang memengaruhi kode bahkan tanpa Anda sadari.
Singkatnya, titik henti sementara dapat membantu Anda menemukan dan memperbaiki bug lebih cepat daripada metode console.log()
.
Jika Anda mengingat-ingat kembali cara kerja aplikasi, Anda dapat menebak bahwa jumlah yang tidak tepat (5 + 1 = 51
) dihitung di pemroses peristiwa click
yang terkait dengan tombol Tambahkan Nomor 1 dan Nomor 2. Oleh karena itu, sebaiknya Anda menjeda kode sekitar waktu pemroses click
dieksekusi. Titik Henti Sementara Pemroses Peristiwa memungkinkan Anda melakukan hal tersebut:
- Di bagian Debugger, klik Event Listener Breakpoints untuk meluaskan bagian tersebut. DevTools menampilkan daftar kategori peristiwa yang dapat diluaskan, seperti Animasi dan Papan Klip.
- Di samping kategori peristiwa Mouse, klik Expand. DevTools menampilkan daftar peristiwa mouse, seperti click dan mousedown. Setiap peristiwa memiliki kotak centang di sampingnya.
Centang kotak klik. DevTools kini disiapkan untuk dijeda otomatis saat pemroses peristiwa
click
mana pun dieksekusi.Kembali ke demo, klik Tambahkan Nomor 1 dan Nomor 2 lagi. DevTools menjeda demo dan menyoroti baris kode di panel Sumber. DevTools harus dijeda pada baris kode ini:
function onClick() {
Jika Anda dijeda pada baris kode yang berbeda, tekan
Lanjutkan Eksekusi Skrip hingga Anda dijeda pada baris yang benar.
Titik Henti Sementara Pemroses Peristiwa hanyalah salah satu dari banyak jenis titik henti sementara yang tersedia di DevTools. Sebaiknya pelajari semua jenisnya, karena setiap jenis pada akhirnya membantu Anda men-debug berbagai skenario secepat mungkin. Lihat Menjeda Kode dengan Titik Henti untuk mempelajari kapan dan cara menggunakan setiap jenis.
Menyusuri kode
Salah satu penyebab umum bug adalah jika skrip dieksekusi dalam urutan yang salah. Dengan menelusuri kode, Anda dapat mengikuti proses eksekusi kode, baris demi baris, dan mengetahui secara persis tempat kode dieksekusi dalam urutan yang berbeda dengan yang Anda harapkan. Coba sekarang:
Di panel Sumber pada DevTools, klik
Masuk ke panggilan fungsi berikutnya untuk melangkahi eksekusi fungsionClick()
, baris demi baris. DevTools menandai baris kode berikut:if (inputsAreEmpty()) {
Klik
Step over next function call.DevTools mengeksekusi
inputsAreEmpty()
tanpa melangkah ke dalamnya. Perhatikan cara DevTools melewati beberapa baris kode. Hal ini karenainputsAreEmpty()
dievaluasi sebagai salah, sehingga blok kode pernyataanif
tidak dieksekusi.
Itulah gambaran umum mengenai penyusuran kode. Jika melihat kode di get-started.js
, Anda dapat
melihat bahwa bug mungkin ada di suatu tempat dalam fungsi updateLabel()
. Daripada menelusuri
setiap baris kode, Anda dapat menggunakan jenis titik henti sementara lain untuk menjeda kode yang lebih dekat dengan kemungkinan
lokasi bug.
Menetapkan titik henti sementara baris kode
Breakpoint baris kode adalah jenis titik henti sementara yang paling umum. Jika Anda ingin menjeda di baris kode tertentu, gunakan titik henti sementara baris kode:
Lihat baris terakhir kode di
updateLabel()
:label.textContent = addend1 + ' + ' + addend2 + ' = ' + sum;
Di sebelah kiri kode, Anda dapat melihat nomor baris dari baris kode tertentu ini, yaitu 32. Klik 32. DevTools menempatkan ikon biru di atas 32. Ini berarti ada breakpoint baris kode pada baris ini. DevTools sekarang selalu dijeda sebelum baris kode ini dijalankan.
Klik menampilkan nilai
Lanjutkan eksekusi skrip. Skrip akan terus dieksekusi hingga mencapai baris 32. Pada baris 29, 30, dan 31, DevToolsaddend1
,addend2
, dansum
secara inline di samping deklarasinya.
Dalam contoh ini, DevTools dijeda pada titik henti sementara baris kode pada baris 32.
Memeriksa nilai variabel
Nilai addend1
, addend2
, dan sum
terlihat mencurigakan. Nilai tersebut diberi tanda kutip, yang
berarti string. Ini adalah hipotesis yang baik untuk menjelaskan penyebab bug. Sekarang
saatnya untuk mengumpulkan informasi selengkapnya. DevTools menyediakan banyak alat untuk memeriksa nilai
variabel.
Metode 1: Memeriksa Cakupan
Saat Anda dijeda pada baris kode, tab Cakupan akan menampilkan variabel lokal dan global yang ditentukan pada titik ini dalam eksekusi, beserta nilai setiap variabel. Laporan ini juga menampilkan variabel penutupan, jika berlaku. Jika Anda tidak dijeda pada baris kode, tab Cakupan akan kosong.
Klik dua kali nilai variabel untuk mengeditnya.
Metode 2: Ekspresi watch
Tab Watch memungkinkan Anda memantau nilai variabel dari waktu ke waktu. Watch tidak hanya terbatas pada variabel. Anda dapat menyimpan ekspresi JavaScript yang valid di tab Watch.
Coba sekarang:
- Klik tab Tonton.
- Klik Tambahkan ekspresi watch.
- Ketik
typeof sum
. - Tekan Enter. DevTools menampilkan
typeof sum: "string"
. Nilai di sebelah kanan titik dua adalah hasil ekspresi Anda.
Screenshot ini menampilkan tab Watch (kanan bawah) setelah membuat ekspresi
pengawasan typeof sum
.
Seperti diduga, sum
dievaluasi sebagai string, padahal seharusnya sebagai angka. Anda sekarang telah mengonfirmasi
bahwa inilah penyebab bug tersebut.
Metode 3: Konsol
Selain melihat pesan console.log()
, Anda juga dapat menggunakan Konsol untuk mengevaluasi pernyataan JavaScript arbitrer. Dalam hal proses debug, Anda dapat menggunakan Konsol untuk menguji potensi perbaikan
bug. Coba sekarang:
- Jika panel samping Konsol tidak terbuka, tekan Escape untuk membukanya. Panel samping akan terbuka di bagian bawah jendela DevTools.
- Di Konsol, ketik
parseInt(addend1) + parseInt(addend2)
. Pernyataan ini berfungsi karena Anda dijeda pada baris kode denganaddend1
danaddend2
dalam cakupan. - Tekan Enter. DevTools akan mengevaluasi pernyataan dan mencetak
6
, yang merupakan hasil yang diharapkan dari demo tersebut.
Screenshot ini menampilkan panel samping Console setelah mengevaluasi parseInt(addend1) + parseInt(addend2)
.
Menerapkan perbaikan
Anda telah menemukan perbaikan untuk bug tersebut. Sekarang tinggal mencoba perbaikan dengan mengedit kode dan menjalankan ulang demo. Anda tidak perlu keluar dari DevTools untuk menerapkan perbaikan. Anda dapat mengedit kode JavaScript langsung dalam UI DevTools. Coba sekarang:
- Klik Lanjutkan eksekusi skrip.
- Di Editor Kode, ganti baris 31,
var sum = addend1 + addend2
, denganvar sum = parseInt(addend1) + parseInt(addend2)
. - Tekan Command + S (Mac) atau Control + S (Windows, Linux) untuk menyimpan perubahan.
- Klik Nonaktifkan titik henti sementara. Warnanya berubah menjadi biru untuk menunjukkan bahwa tombol tersebut aktif. Meskipun telah disetel, DevTools akan mengabaikan breakpoint yang telah Anda tetapkan.
- Coba demo dengan nilai yang berbeda. Demo sekarang menghitung dengan benar.
Langkah berikutnya
Tutorial ini hanya menunjukkan dua cara untuk menyetel titik henti sementara. DevTools menawarkan banyak cara lainnya, termasuk:
- Breakpoint bersyarat yang hanya dipicu jika kondisi yang Anda berikan adalah true.
- Titik henti sementara pada pengecualian yang tertangkap atau yang tidak tertangkap.
- Titik henti sementara XHR yang dipicu saat URL yang diminta cocok dengan substring yang Anda berikan.
Lihat Menjeda Kode dengan Titik Henti Sementara untuk mempelajari kapan dan cara menggunakan setiap jenis.
Ada beberapa kontrol penyusuran kode yang belum dijelaskan dalam tutorial ini. Lihat Melangkahi baris kode untuk mempelajari lebih lanjut.