.astro files), and some can also be used in .mdx files.
Template directives are used to control an element or component’s behavior in some way. A directive could enable some compiler feature that makes your life easier (like using class:list instead of class), or a directive could tell the Astro compiler to do something special with that component (like hydrating with client:load).
Rules
For a template directive to be valid, it must:- Include a colon
:in its name, using the formX:Y(ex:client:load) - Be visible to the compiler (ex:
<X {...attr}>would not work ifattrcontained a directive)
<X client:load />(takes no value)<X class:list={['some-css-class']} />(takes an array)
Common Directives
class:list
Takes an array of class values and converts them into a class string. Powered by the clsx library.
string- Added to the elementclassObject- All truthy keys are added to the elementclassArray- Flattenedfalse,null, orundefined- Skipped
set:html
Injects an HTML string into an element, similar to setting
el.innerHTML.set:html on a <Fragment> to avoid adding an unnecessary wrapper element:
set:html={Promise<string>} injects an HTML string wrapped in a Promise:
set:html={Promise<Response>} injects a Response:
set:html can be used on any tag, including <script> tags for JSON-LD schemas:
set:text
Injects a text string into an element, similar to setting
el.innerText. The value is automatically escaped by Astro.<div>{someText}</div>) and therefore this directive is not commonly used.
Client Directives
These directives control how UI Framework components are hydrated on the page. By default, a UI Framework component is not hydrated in the client. If noclient:* directive is provided, its HTML is rendered onto the page without JavaScript.
client:load
Load and hydrate the component JavaScript immediately on page load.
Useful for: Immediately-visible UI elements that need to be interactive as soon as possible.
client:idle
Load and hydrate the component JavaScript once the page is done with its initial load and the
requestIdleCallback event has fired.Useful for: Lower-priority UI elements that don’t need to be immediately interactive.
The maximum time to wait (in milliseconds) before hydrating the component, even if the page is not yet done with its initial load.
client:visible
Load and hydrate the component JavaScript once the component has entered the user’s viewport. Uses an IntersectionObserver internally.
Useful for: Low-priority UI elements that are far down the page or so resource-intensive to load that you would prefer not to load them at all if the user never saw the element.
A margin (in pixels) around the component. When specified, the component will hydrate when this margin enters the viewport, rather than the component itself.
client:media
Load and hydrate the component JavaScript once a certain CSS media query is met.
Useful for: Sidebar toggles, or other elements that might only be visible on certain screen sizes.
client:only
Skips HTML server rendering and renders only on the client. Requires the component’s framework as a value.
Display loading content
For components that render only on the client, you can display fallback content while they are loading:Server Directives
These directives control how server island components are rendered.server:defer
Transforms the component into a server island, causing it to be rendered on demand, outside the scope of the rest of the page rendering.
Script & Style Directives
These directives can only be used on HTML<script> and <style> tags.
is:global
Makes the contents of a
<style> tag apply globally on the page. Disables Astro’s CSS scoping system.is:inline
Tells Astro to leave the
<script> or <style> tag as-is in the final output HTML. The contents will not be processed, optimized, or bundled.The
is:inline directive is implied whenever any attribute other than src is used on a <script> or <style> tag. The one exception is using the define:vars directive on the <style> tag.define:vars
Passes server-side variables from your component frontmatter into client
<script> or <style> tags. Any JSON-serializable frontmatter variable is supported.Advanced Directives
is:raw
Instructs the Astro compiler to treat any children of that element as text, ignoring all special Astro templating syntax.