2.9 KiB
title |
---|
Debugging |
@debug
$inspect
Svelte provides two built-in ways to debug your application.
$inspect
The $inspect
rune is roughly equivalent to console.log
, with the exception that it will re-run whenever its
argument changes. $inspect
tracks reactive state deeply, meaning that updating something inside an object
or array using fine-grained reactivity will cause it to re-fire. (Demo:)
<script>
let count = $state(0);
let message = $state('hello');
$inspect(count, message); // will console.log when `count` or `message` change
</script>
<button onclick={() => count++}>Increment</button>
<input bind:value={message} />
$inspect
returns a property with
, which you can invoke with a callback, which will then be invoked instead of console.log
. The first argument to the callback is either "init"
or "update"
, all following arguments are the values passed to $inspect
. Demo:
<script>
let count = $state(0);
$inspect(count).with((type, count) => {
if (type === 'update') {
debugger; // or `console.trace`, or whatever you want
}
});
</script>
<button onclick={() => count++}>Increment</button>
A convenient way to find the origin of some change is to pass console.trace
to with
:
// @errors: 2304
$inspect(stuff).with(console.trace);
$inspect
only works during development. In a production build it becomes a noop.
@debug
<!--- copy: false --->
{@debug}
<!--- copy: false --->
{@debug var1, var2, ..., varN}
The {@debug ...}
tag offers an alternative to console.log(...)
. It logs the values of specific variables whenever they change, and pauses code execution if you have devtools open.
<script>
let user = {
firstname: 'Ada',
lastname: 'Lovelace'
};
</script>
{@debug user}
<h1>Hello {user.firstname}!</h1>
{@debug ...}
accepts a comma-separated list of variable names (not arbitrary expressions).
<!-- Compiles -->
{@debug user}
{@debug user1, user2, user3}
<!-- WON'T compile -->
{@debug user.firstname}
{@debug myArray[0]}
{@debug !isReady}
{@debug typeof user === 'object'}
The {@debug}
tag without any arguments will insert a debugger
statement that gets triggered when any state changes, as opposed to the specified variables.