Published Nov 8, 2023 ⦁ 6 min read

Chrome DevTools: Master Debugging with These 10 Advanced Tips

Chrome DevTools provides web developers with an incredibly powerful toolkit for inspecting, optimizing, and understanding front-end code. As Chrome continues dominating as the leading browser, mastering its built-in developer tools is critical for boosting productivity and efficiency.

In this article, we'll explore some overlooked yet highly useful Chrome DevTools features to take your debugging skills to the next level. Whether you're just getting started or have used DevTools for years, these pro tips will help you debug JavaScript, analyze network activity, audit sites, and leverage the console more effectively.

With complex front-end frameworks on the rise, understanding how to debug and profile apps in the browser is more essential than ever. The goal is to maximize productivity and minimize headaches when building modern web experiences. Let's dive in!

Leveraging the Console

The console is likely DevTools' most familiar feature for logging data, errors, warnings, and messages during development. Here are some more advanced tips for leveling up your console skills:

  • console.table() - Logging arrays or objects with this method renders the output as a table, greatly improving readability:
const dogs = [
  { name: 'Rusty', age: 3 },
  { name: 'Wyatt', age: 5 },
];

console.table(dogs);
  • console.time() / console.timeEnd() - Use these to time operations and measure how long portions of code take to execute:
console.time('fetchData'); 
fetch('https://example.com/data')
  .then(response => response.json())
  .then(data => {
    console.timeEnd('fetchData');
  }); 
  • console.count() - Counting how often a piece of code runs is easy with console.count(). Increment a counter each time a function is called:
function logMessage() {
  console.count('Message logged');
  console.log('Hello World!');
}
  • console.trace() - When debugging complex code, understanding execution flow is key. console.trace() prints the current stack trace:
const foo = () => console.trace();
foo();

Debugging with Breakpoints

  • Pause execution and debug live by setting breakpoints in the Sources panel via the UI or keyboard shortcut Ctrl+B.

  • Conditional breakpoints - Break only when certain conditions are met by right clicking a breakpoint and adding custom logic.

  • Control flow - Step through code line-by-line with F10 and F11. Use F8 to continue execution until the next breakpoint.

  • Context menu - Temporarily disable or fully remove breakpoints using the contextual menu.

Improving Readability

  • Grouping - Log related data together with console.group() and console.groupEnd(). Collapse groups with console.groupCollapsed():
console.group('User Data');
console.log('Name:', name); 
console.log('Age:', age);
console.groupEnd('User Data');
  • Formatting - console.dir() prints objects and arrays as an interactive tree, improving scanning.

  • Tables - As mentioned above, console.table() neatly formats tabular data.

Inspecting Network Activity

Understanding how the browser loads resources is critical for web development. The Network panel captures all requests in one place for analysis.

  • See all network requests by type like XHR, JavaScript, CSS, images, media, fonts, etc.

  • Throttling - Simulate slow networks to debug loading behavior. Enable throttling presets like GPRS, Fast 3G, or Offline.

  • Initiators - The Initiator column shows what triggered a request, like script tags. Identify cascading effects.

  • Details - Inspect timing, headers, cookies, parameters, and more for any request. View response payloads for XHRs.

Analyzing Performance

  • The waterfall view shows resource loading over time, making it easy to pinpoint slow requests.

  • Analyze requests one-by-one to find optimization opportunities. Diagnose what's blocking page load.

  • Critical request chains - Identify sequences of key requests impacting load. Minimize critical resources.

  • Check for unused CSS, JS, and web fonts. Leverage code splitting and tree shaking.

  • Profile JavaScript execution and pinpoint expensive functions with the JS profiler.

Previewing Responses

  • View JSON responses in a formatted JSON viewer instead of raw text.

  • See image responses right in DevTools instead of opening a new tab.

  • Inspect full response details like status codes, headers, cookies, timings, etc.

  • For HTML responses, preview rendered markup right in DevTools.

  • Toggle through different response previews like images, text, or JavaScript.

Auditing for Best Practices

Automated Lighthouse audits identify opportunities to improve performance, accessibility, SEO, and more.

  • Run audits on-demand or in CI/CD pipelines to prevent regressions.

  • Reports highlight failures and provide recommendations for improvements.

  • Customize categories and tweak audit thresholds as needed.

  • Test on mobile devices and simulate throttling for representative results.

Performance Optimization

  • Track key metrics like FCP, LCP, TTI, TBT, and CLS.

  • Diagnose loading regressions when metrics decline after updates. Find fixes.

  • Check for unused JavaScript and CSS bloating bundles and slowing page load.

  • Enable text compression, HTTP caching, code minification.

  • Ensure non-critical JS executes after primary content loads.

Accessibility Checks

  • Identify insufficient color contrast for readable text.

  • Validate ARIA attributes and semantics for interactive elements.

  • Check HTML structure and semantics.

  • Validate keyboard accessibility and screen reader support.

  • Find opportunities to add image alt attributes and form labels.

For example, an audit may reveal `` elements lacking an `aria-label` for screen readers. Adding the attribute improves accessibility.

Debugging JavaScript Code

Debug JavaScript right in the Sources panel for efficient development without print debugging.

  • Set breakpoints, inspect scope and state, and step through code.

  • Use watch expressions to monitor variable values in real-time.

  • Step over code with F10 or step into functions with F11.

  • Understand flow using the Call Stack pane.

  • Debug async code like promises and WebWorkers with async stack traces.

Using the Debugger

  • Manage all breakpoints in the Breakpoints pane.

  • Create conditional breakpoints to limit pausing to certain scenarios.

  • Quickly disable/remove breakpoints from the context menu.

  • F8 resumes execution until the next breakpoint, while F10 steps over the next line.

  • Leverage debugger; statements to pause without setting breakpoints.

Live Editing

  • Many changes can be previewed live without reloading.

  • Edit stylesheets and see updates instantly. Hot reload CSS.

  • For JavaScript, some edits will hot reload modules without refreshing.

  • Use inline variable watches during debugging to track values.

  • Live editing has limitations so hard refreshes may still be required.

Mastering Chrome DevTools unlocks powerful capabilities for building better web experiences. This article only scratched the surface of what's possible. As you continue honing your debugging skills, explore DevTools further using resources like Google's developer docs. The tips here will help you debug apps faster and boost productivity.

Ready to take your DevTools skills to the next level? DevHunt showcases the latest Chrome extensions and tools to add to your web dev arsenal. Discover what's new to maximize your workflows. Happy debugging!