Proses debug web modern di Chrome DevTools

Pengantar

Saat ini, penulis dapat menggunakan banyak abstraksi untuk membangun aplikasi Web mereka. Alih-alih berinteraksi langsung dengan API tingkat rendah yang disediakan Platform Web, banyak penulis memanfaatkan framework, alat build, dan compiler untuk menulis aplikasi dari perspektif tingkat yang lebih tinggi.

Misalnya, komponen yang dibangun di atas framework Angular ditulis di TypeScript dengan template HTML. Di balik layar, Angular CLI dan webpack mengompilasi semuanya ke JavaScript dan menjadi satu paket, yang kemudian dikirimkan ke browser.

Saat men-debug atau membuat profil aplikasi Web di DevTools, Anda saat ini dapat melihat dan men-debug versi kode yang dikompilasi ini, bukan kode yang sebenarnya Anda tulis. Sebagai seorang penulis, Anda tidak menginginkan hal ini:

  • Anda tidak ingin men-debug kode JavaScript yang diminifikasi, Anda ingin men-debug kode JavaScript asli Anda.
  • Saat menggunakan TypeScript, Anda tidak ingin men-debug JavaScript, Anda ingin men-debug kode TypeScript asli Anda.
  • Saat menggunakan template seperti dengan Angular, Lit, atau JSX, Anda tidak selalu ingin men-debug DOM yang dihasilkan. Anda mungkin ingin men-debug komponennya sendiri.

Secara keseluruhan, Anda mungkin ingin men-debug kode Anda sendiri seperti yang Anda tulis.

Meskipun peta sumber sudah menutup kesenjangan ini, ada banyak hal yang dapat dilakukan Chrome DevTools dan ekosistem di area ini.

Mari kita lihat.

Kode yang Ditulis versus yang Di-deploy

Saat ini, ketika menavigasi hierarki file di Panel Source, Anda dapat melihat konten paket yang dikompilasi—dan sering kali diminifikasi—. File ini adalah file sebenarnya yang didownload dan dijalankan oleh browser. DevTools menyebutnya sebagai Kode yang Di-deploy.

Screenshot hierarki file di Chrome DevTools yang menampilkan Kode yang Di-deploy.

Hal ini tidak terlalu berguna dan sering kali sulit dipahami. Sebagai penulis, Anda ingin melihat dan men-debug kode yang ditulis, bukan Kode yang Di-deploy.

Untuk mengimbanginya, Anda sekarang dapat meminta hierarki menampilkan Kode yang Ditulis. Hal ini membuat hierarki lebih mirip dengan file sumber yang bisa Anda lihat di IDE, dan file ini sekarang dipisahkan dari Kode yang Di-deploy.

Screenshot hierarki file di Chrome DevTools yang menampilkan Kode yang Ditulis.

Untuk mengaktifkan opsi ini di Chrome DevTools, buka Setelan > Eksperimen dan centang Kelompokkan sumber ke dalam hierarki yang Ditulis dan Di-deploy.

Screenshot Setelan DevTools.

“Hanya kode saya”

Saat menggunakan dependensi atau membangun di atas framework, file pihak ketiga dapat menghalangi Anda. Biasanya Anda hanya ingin melihat kode Anda, bukan kode beberapa library pihak ketiga yang disimpan di folder node_modules.

Untuk mengatasi hal ini, DevTools mengaktifkan setelan tambahan secara default: Otomatis tambahkan skrip pihak ketiga yang diketahui ke daftar yang diabaikan. Anda dapat menemukannya di DevTools > Setelan > Daftar Pengabaian.

Screenshot Setelan DevTools.

Dengan mengaktifkan setelan ini, DevTools akan menyembunyikan file atau folder apa pun yang telah ditandai oleh framework atau alat build sebagai untuk diabaikan.

Mulai Angular v14.1.0, konten folder node_modules dan webpack telah ditandai sebagaimana mestinya. Oleh karena itu, folder ini, file di dalamnya, dan artefak pihak ketiga lainnya tidak muncul di berbagai tempat di DevTools.

Sebagai penulis, Anda tidak perlu melakukan apa pun untuk memungkinkan perilaku baru ini. Penerapan perubahan ini bergantung pada framework.

Abaikan kode yang tercantum dalam stack trace

Satu tempat di mana file yang tercantum dalam daftar diabaikan ini tidak lagi muncul adalah di pelacakan tumpukan. Sebagai penulis, Anda kini bisa melihat pelacakan tumpukan yang relevan yang lebih banyak.

Screenshot pelacakan tumpukan di DevTools.

Jika ingin melihat semua frame panggilan stack trace, Anda dapat mengklik link Show more frames kapan saja.

Hal yang sama berlaku untuk stack panggilan yang Anda lihat saat melakukan proses debug dan pemrosesan kode. Saat framework atau pemaket memberi tahu DevTools tentang skrip pihak ketiga, DevTools otomatis menyembunyikan semua frame panggilan yang tidak relevan dan melompati kode yang tercantum dalam daftar yang diabaikan saat melakukan proses debug.

Screenshot DevTools Source Debugger saat melakukan proses debug.

Abaikan kode yang tercantum di hierarki file

Untuk menyembunyikan file dan folder yang ada dalam daftar yang diabaikan dari hierarki file Authored Code di panel Sources, centang Sembunyikan kode yang tercantum dalam tampilan hierarki sumber di Setelan > Eksperimen di DevTools.

Screenshot Setelan DevTools.

Dalam contoh project Angular, folder node_modules dan webpack kini disembunyikan.

Screenshot hierarki file di Chrome DevTools menampilkan Kode yang Ditulis, tetapi tidak menampilkan node_modules.

Abaikan kode yang tercantum di menu “Quick Open”

Kode yang tercantum dalam daftar yang diabaikan tidak hanya disembunyikan dari hierarki file, tetapi juga disembunyikan dari menu “Quick Open” (Control+P (Linux/Windows) atau Command+P (Mac)).

Screenshot DevTools dengan menu “Quick Open”.

Peningkatan lainnya pada pelacakan tumpukan

Setelah membahas pelacakan tumpukan yang relevan, Chrome DevTools memperkenalkan lebih banyak peningkatan pada pelacakan tumpukan.

Stack Trace Tertaut

Jika beberapa operasi dijadwalkan agar terjadi secara asinkron, stack trace di DevTools saat ini hanya menceritakan sebagian dari cerita.

Misalnya, berikut adalah penjadwal yang sangat sederhana dalam file framework.js fiktif:

function makeScheduler() {
  const tasks = [];

  return {
    schedule(f) {
      tasks.push({ f });
    },

    work() {
      while (tasks.length) {
        const { f } = tasks.shift();
        f();
      }
    },
  };
}

const scheduler = makeScheduler();

function loop() {
  scheduler.work();
  requestAnimationFrame(loop);
};

loop();

... dan cara developer dapat menggunakannya dalam kode mereka sendiri dalam file example.js:

function someTask() {
  console.trace("done!");
}

function businessLogic() {
  scheduler.schedule(someTask);
}

businessLogic();

Saat menambahkan titik henti sementara di dalam metode someTask atau saat memeriksa rekaman aktivitas yang dicetak di konsol, Anda tidak melihat penyebutan panggilan businessLogic() yang merupakan "penyebab root" operasi ini.

Sebagai gantinya, Anda hanya akan melihat logika penjadwalan framework yang menyebabkan eksekusi tugas dan tidak ada breadcrumb dalam stack trace untuk membantu Anda mengetahui tautan kausal antar-peristiwa yang mengarah ke tugas ini.

Stack trace dari beberapa kode yang dieksekusi secara asinkron tanpa informasi tentang waktu penjadwalannya.

Berkat fitur baru yang disebut “Pemberian Tag Stack Asinkron”, Anda bisa mengisahkan keseluruhan cerita dengan menautkan kedua bagian kode asinkron bersama-sama.

Asynchronous Stack Tagging API memperkenalkan metode console baru bernama console.createTask(). Tanda tangan API adalah sebagai berikut:

interface Console {
  createTask(name: string): Task;
}

interface Task {
  run<T>(f: () => T): T;
}

Panggilan console.createTask() menampilkan instance Task yang nantinya dapat Anda gunakan untuk menjalankan f konten tugas.

// Task Creation
const task = console.createTask(name);

// Task Execution
task.run(f);

Tugas ini membentuk link antara konteks tempatnya dibuat dan konteks fungsi asinkron yang sedang dieksekusi.

Diterapkan ke fungsi makeScheduler dari atas, kode menjadi berikut:

function makeScheduler() {
  const tasks = [];

  return {
    schedule(f) {
      const task = console.createTask(f.name);
      tasks.push({ task, f });
    },

    work() {
      while (tasks.length) {
        const { task, f } = tasks.shift();
        task.run(f); // instead of f();
      }
    },
  };
}

Berkat hal ini, Chrome DevTools kini dapat menampilkan pelacakan tumpukan yang lebih baik.

Stack trace dari beberapa kode yang dieksekusi secara asinkron dengan informasi tentang waktu penjadwalannya.

Perhatikan bahwa businessLogic() kini disertakan dalam stack trace. Bukan cuma itu, tugas ini memiliki nama yang sudah dikenal someTask, bukan requestAnimationFrame generik seperti sebelumnya.

Frame Panggilan yang Ramah

Framework sering kali menghasilkan kode dari semua jenis bahasa template saat membuat project, seperti template Angular atau JSX yang mengubah kode yang tampak HTML menjadi JavaScript biasa yang akhirnya berjalan di browser. Terkadang, fungsi yang dihasilkan jenis ini diberi nama yang tidak terlalu mirip — baik nama dengan huruf tunggal setelah diminifikasi atau nama yang tidak jelas atau asing bahkan jika tidak.

Dalam project contoh, contohnya adalah AppComponent_Template_app_button_handleClick_1_listener yang Anda lihat dalam stack trace.

Screenshot stack trace dengan nama fungsi yang dibuat secara otomatis.

Untuk mengatasi hal ini, Chrome DevTools kini mendukung penggantian nama fungsi ini melalui peta sumber. Jika source map memiliki entri nama untuk awal cakupan fungsi, frame panggilan harus menampilkan nama tersebut dalam stack trace.

Sebagai penulis, Anda tidak perlu melakukan apa pun untuk memungkinkan perilaku baru ini. Penerapan perubahan ini bergantung pada framework.

Rencana ke depan

Berkat tambahan yang diuraikan dalam postingan ini, Chrome DevTools bisa menawarkan pengalaman proses debug yang lebih baik. Ada lebih banyak area yang ingin dijelajahi oleh tim. Khususnya, cara meningkatkan pengalaman pembuatan profil di DevTools.

Tim Chrome DevTools mendorong penulis framework untuk mengadopsi kemampuan baru ini. Studi Kasus: Proses Debug Angular yang Lebih Baik dengan DevTools menawarkan panduan tentang cara menerapkannya.