We use client:idle to make a component load only when the browser is not busy. This helps the page load faster and feel smoother.
When you have a widget that is not needed right away, like a chat box or a comments section.
If you want to improve page speed by delaying JavaScript until the user is idle.
For parts of the page that don't need to be interactive immediately, like a newsletter signup form.
When you want to reduce the initial load on the browser to save battery or data.
If you want to improve user experience by loading less important features later.
Syntax
Astro
<Component client:idle />
This attribute tells Astro to wait until the browser is idle before hydrating the component.
It helps defer JavaScript execution without blocking the main content.
Examples
This loads MyWidget only when the browser is idle, improving initial page speed.
Astro
<MyWidget client:idle />
The chat box will hydrate after the main content is ready and the browser is free.
Astro
<ChatBox client:idle />
Sample Program
This example shows a simple page with a Counter component. The counter will only start working when the browser is idle, so the main page loads fast.
Astro
---
import Counter from'../components/Counter.jsx';
---
<html lang="en">
<head>
<title>Idle Hydration Example</title>
</head>
<body>
<h1>Welcome to the page!</h1>
<p>This content loads immediately.</p>
<!-- Counter will hydrate only when browser is idle -->
<Counter client:idle />
</body>
</html>
OutputSuccess
Important Notes
Using client:idle can improve performance but may delay interactivity.
It is best for components that are not critical for the first user interaction.
Check browser DevTools Performance tab to see when the component hydrates.
Summary
client:idle delays component hydration until the browser is free.
This improves page speed and user experience by loading less important parts later.
Use it for widgets or features that don't need to be interactive immediately.
Practice
(1/5)
1. What does the client:idle directive do in Astro components?
easy
A. It hydrates the component immediately on page load.
B. It delays hydration until the browser is idle, improving page speed.
C. It prevents the component from ever hydrating.
D. It hydrates the component only when the user clicks it.
Solution
Step 1: Understand hydration timing
client:idle waits for the browser to be idle before hydrating a component.
Step 2: Compare options
Options B, C, and D describe immediate hydration, no hydration, or hydration on click, which are not what client:idle does.
Final Answer:
It delays hydration until the browser is idle, improving page speed. -> Option B
Quick Check:
client:idle delays hydration = A [OK]
Hint: Remember: idle means wait until browser is free [OK]
Common Mistakes:
Confusing client:idle with client:load
Thinking it hydrates immediately
Assuming it waits for user interaction
2. Which is the correct syntax to use client:idle in an Astro component?
easy
A.
B.
C.
D.
Solution
Step 1: Recall Astro hydration syntax
Astro uses directives like client:idle with a colon, not dashes or underscores.
Step 2: Check each option
Only uses the correct colon syntax. Others use invalid attribute names.
Final Answer:
<MyWidget client:idle /> -> Option A
Quick Check:
Correct syntax uses colon = C [OK]
Hint: Use colon, not dash or underscore for client directives [OK]
Common Mistakes:
Replacing colon with dash or underscore
Using camelCase instead of colon syntax
Omitting the directive entirely
3. Given this Astro component usage:
<Counter client:idle />
What happens when the page loads?
medium
A. The Counter component hydrates only after the browser is idle, delaying interactivity.
B. The Counter component hydrates immediately and is interactive right away.
C. The Counter component never hydrates and stays static.
D. The Counter component hydrates only when the user scrolls to it.
Solution
Step 1: Understand client:idle behavior
The client:idle directive delays hydration until the browser is idle.
Step 2: Analyze options
The Counter component hydrates only after the browser is idle, delaying interactivity. correctly describes delayed hydration after idle. Options A, C, and D are incorrect because hydration is delayed, not immediate, never, or on scroll. The Counter component hydrates only when the user scrolls to it. describes lazy hydration on scroll, which is client:visible, not idle.
Final Answer:
The Counter component hydrates only after the browser is idle, delaying interactivity. -> Option A
Quick Check:
client:idle delays hydration until idle = B [OK]
Hint: Idle means wait for free browser time before hydrating [OK]
Common Mistakes:
Confusing client:idle with client:load or client:visible
Thinking hydration is immediate
Assuming hydration waits for user action
4. You wrote this Astro code:
<Widget client:idle>Click me</Widget>
But the component never hydrates. What is the likely problem?
medium
A. You must add client:load instead of client:idle for hydration.
B. client:idle only works on self-closing tags, not with children.
C. The browser never becomes idle, so hydration is delayed indefinitely.
D. You forgot to import the Widget component.
Solution
Step 1: Check component import
If the component is not imported, Astro cannot hydrate it regardless of directives.
Step 2: Evaluate other options
client:idle works with children and self-closing tags. The browser usually becomes idle eventually. client:load hydrates immediately but is not required here.
Final Answer:
You forgot to import the Widget component. -> Option D
Quick Check:
Missing import causes no hydration = D [OK]
Hint: Always import components before using hydration directives [OK]
Common Mistakes:
Assuming client:idle needs self-closing tags
Thinking browser never becomes idle
Confusing client:idle with client:load
5. You want to improve your page speed by deferring hydration of a chat widget until the browser is idle. Which approach correctly applies client:idle and ensures accessibility?
hard
A. Use <ChatWidget client:load aria-hidden='true' /> to hydrate immediately but hide from screen readers.
B. Use <ChatWidget client:idle /> without aria-label because hydration delays interaction anyway.
C. Use <ChatWidget client:idle aria-label='Chat widget' /> so it hydrates when idle and has an accessible label.
D. Use <ChatWidget client:idle tabindex='-1' /> to defer hydration and remove keyboard focus.
Solution
Step 1: Apply client:idle correctly
Using client:idle defers hydration until idle, improving page speed.
Step 2: Ensure accessibility
Adding aria-label provides a descriptive label for screen readers, maintaining accessibility.
Step 3: Evaluate other options
Use <ChatWidget client:idle /> without aria-label because hydration delays interaction anyway. lacks accessibility label. Use <ChatWidget client:load aria-hidden='true' /> to hydrate immediately but hide from screen readers. hydrates immediately and hides from screen readers, reducing accessibility. Use <ChatWidget client:idle tabindex='-1' /> to defer hydration and remove keyboard focus. removes keyboard focus, harming accessibility.
Final Answer:
Use <ChatWidget client:idle aria-label='Chat widget' /> so it hydrates when idle and has an accessible label. -> Option C
Quick Check:
Defer hydration + accessibility = A [OK]
Hint: Add aria-label with client:idle for accessible deferred hydration [OK]
Common Mistakes:
Ignoring accessibility attributes
Using client:load instead of client:idle
Removing keyboard focus unnecessarily
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.