Tutorial ini mengajarkan alur kerja dasar untuk men-debug masalah JavaScript di DevTools. Baca terus, atau tonton video dari tutorial ini.
Mereproduksi bug
Menemukan serangkaian tindakan yang mereproduksi bug secara konsisten 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 fitur yang 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. Titik
titik henti memungkinkan Anda menjeda kode di tengah eksekusi, dan memeriksa semua nilai pada
saat tersebut. 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 menampilkan 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 mundur selangkah dan memikirkan cara kerja aplikasi, Anda dapat membuat perkiraan yang matang bahwa jumlah yang salah (5 + 1 = 51
) dihitung dalam pemroses peristiwa click
yang terkait dengan tombol Tambahkan Nomor 1 dan Angka 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. Melangkahi kode memungkinkan Anda menelusuri eksekusi kode, baris demi baris, dan mengetahui secara persis tempat dieksekusi dalam urutan yang berbeda dari yang Anda harapkan. Coba sekarang:
Di panel Sumber pada DevTools, klik
Step into next function call untuk melangkahi eksekusi fungsionClick()
, baris demi baris. DevTools menandai baris kode berikut:if (inputsAreEmpty()) {
Klik
Step over next function.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
Titik henti sementara baris kode adalah jenis titik henti sementara yang paling umum. Jika Anda ingin menjeda 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 akan menempatkan ikon biru di atas 32. Ini berarti ada breakpoint baris kode pada baris ini. DevTools kini selalu dijeda sebelum baris kode ini dieksekusi.
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 lebih banyak informasi. 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 Tonton memungkinkan Anda memantau nilai variabel dari waktu ke waktu. Tonton tidak hanya terbatas pada variabel. Anda dapat menyimpan ekspresi JavaScript yang valid di tab Watch.
Coba sekarang:
- Klik tab Tonton.
- Klik Tambahkan ekspresi smartwatch.
- 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 yang diduga, sum
sedang dievaluasi sebagai string, padahal seharusnya berupa 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. Alat ini 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 Code Editor, 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 perangkat tersebut aktif. Meskipun ini disetel, DevTools mengabaikan breakpoint yang telah Anda setel.
- Coba demo dengan nilai yang berbeda. Demo sekarang menghitung dengan benar.
Langkah berikutnya
Tutorial ini hanya menampilkan dua cara untuk menyetel titik henti sementara. DevTools menawarkan banyak cara lainnya, termasuk:
- Titik henti sementara bersyarat yang hanya dipicu jika kondisi yang Anda berikan adalah true.
- Titik henti sementara pada pengecualian yang tertangkap atau tidak tertangkap.
- Breakpoint XHR yang dipicu saat URL yang diminta cocok dengan substring yang Anda berikan.
Lihat Menjeda Kode Dengan Titik henti sementara untuk mempelajari waktu dan cara menggunakan setiap jenis.
Ada beberapa kontrol penyusuran kode yang belum dijelaskan dalam tutorial ini. Lihat Melangkahi baris kode untuk mempelajari lebih lanjut.