Lazy Islands
You can mark islands with mochi:hydrate:visible so each one fetches its JS and CSS only when it scrolls into view, via an IntersectionObserver. Lazy islands also have the benefit of not loading their CSS until they come into view, great for secondary content far down the page.
Lazy Island #1
#1 Waiting to hydrate...
Lazy Island #2
#2 Waiting to hydrate...
Lazy Island #3
#3 Waiting to hydrate...
Lazy Island #4
#4 Waiting to hydrate...
Lazy Island #5
#5 Waiting to hydrate...
Lazy Island #6
#6 Waiting to hydrate...
<script>
import LazyDemo from './LazyDemo.svelte';
</script>
<div class="stack">
{#each Array(6) as _, i (i)}
<div class="item">
<h3>Lazy Island #{i + 1}</h3>
<LazyDemo mochi:hydrate:visible index={i + 1} />
</div>
{/each}
</div>
Styles
<style>
.stack {
display: flex;
flex-direction: column;
gap: 1.5rem;
}
.item h3 {
font-size: 0.95rem;
font-weight: 600;
color: var(--text-muted);
margin-bottom: 0.5rem;
}
</style>
More demos
Server Islands How server islands work — components marked mochi:defer render server-side on demand after the initial page is delivered. Portable Text How Portable Text rendering works — @portabletext/svelte maps a JSON block array onto your own Svelte components for types, marks, block styles and lists. View Transitions How view transitions work — drop <ViewTransitions /> into a layout to animate full-page navigations with zero JavaScript.