Bird
Raised Fist0
Denoframework~30 mins

Islands architecture in Fresh in Deno - Mini Project: Build & Apply

Choose your learning style10 modes available
Islands Architecture in Fresh
📖 Scenario: You are building a simple web page using the Fresh framework on Deno. The page shows a greeting message and a button that updates a counter when clicked. To keep the page fast and interactive, you will use Islands architecture to isolate the interactive button as a client-side component.
🎯 Goal: Create a Fresh project with a server-rendered page that includes a client-side interactive counter button using Islands architecture.
📋 What You'll Learn
Create a server-rendered page with a greeting message
Add a client-side interactive counter button as an island
Use Fresh's island component pattern correctly
Ensure the counter increments on button clicks without full page reload
💡 Why This Matters
🌍 Real World
Islands architecture helps build fast web pages by server-rendering static parts and hydrating only small interactive parts on the client. This improves performance and user experience.
💼 Career
Understanding Islands architecture is valuable for frontend developers working with modern frameworks like Fresh, Astro, or Qwik, enabling them to build efficient and scalable web apps.
Progress0 / 4 steps
1
Create the server-rendered page with greeting
Create a file routes/index.tsx with a default exported function component called Home. Inside it, return a <main> element containing an <h1> with the text "Welcome to Fresh Islands!".
Deno
Hint

Use a function component named Home that returns JSX with a <main> and <h1> inside.

2
Create the counter island component
Create a new file islands/Counter.tsx. Export a default function component called Counter. Inside, use React's useState hook to create a count state starting at 0. Return a <button> that shows the text "Count: " followed by the current count. When clicked, the button should increment the count by 1.
Deno
Hint

Use useState from preact/hooks to create a counter state. Return a button that increments the count on click.

3
Import and use the Counter island in the page
In routes/index.tsx, import the Counter component from ../islands/Counter.tsx. Inside the Home component's <main>, below the <h1>, add the <Counter /> component to render the interactive button.
Deno
Hint

Import Counter from ../islands/Counter.tsx and add <Counter /> inside the <main> below the heading.

4
Mark the Counter component as an island
In islands/Counter.tsx, add the line /** @jsxImportSource preact */ at the top to enable JSX. Then export the Counter component as default. This marks it as an island for Fresh to hydrate on the client side.
Deno
Hint

Add /** @jsxImportSource preact */ at the top of islands/Counter.tsx to mark it as an island component.

Practice

(1/5)
1. What is the main purpose of the Islands architecture in Fresh?
easy
A. To split pages into static and interactive parts for better performance
B. To make all parts of the page fully interactive
C. To load the entire page on the client side only
D. To disable JavaScript on the page

Solution

  1. Step 1: Understand Islands architecture concept

    Islands architecture divides a web page into static parts and small interactive components called islands.
  2. Step 2: Identify the main benefit

    This split improves page speed and maintainability by only hydrating interactive parts.
  3. Final Answer:

    To split pages into static and interactive parts for better performance -> Option A
  4. Quick Check:

    Islands architecture = split static + interactive [OK]
Hint: Islands means splitting page into static and interactive parts [OK]
Common Mistakes:
  • Thinking all page parts are interactive
  • Believing Islands disables JavaScript
  • Assuming full client-side rendering
2. Which syntax correctly marks an interactive island component in Fresh?
easy
A. <ISLAND>MyComponent</ISLAND>
B. <Island>MyComponent</Island>
C. <island>MyComponent</island>
D. <ISLAND />

Solution

  1. Step 1: Recall correct tag casing

    Fresh uses uppercase ISLAND tag to mark interactive components.
  2. Step 2: Check tag usage

    The ISLAND tag wraps the component, so it needs opening and closing tags.
  3. Final Answer:

    <ISLAND>MyComponent</ISLAND> -> Option A
  4. Quick Check:

    Correct tag is uppercase ISLAND with open/close [OK]
Hint: Use uppercase <ISLAND> tags to mark interactive parts [OK]
Common Mistakes:
  • Using lowercase or mixed case tags
  • Using self-closing without children
  • Confusing with other component tags
3. Given this Fresh page snippet, what will be interactive on the rendered page?
export default function Page() {
  return (
    <main>
      <h1>Welcome</h1>
      <ISLAND><Counter /></ISLAND>
      <p>Static text</p>
    </main>
  );
}
medium
A. Nothing is interactive because ISLAND is not a valid tag
B. The entire page including the heading and paragraph is interactive
C. Only the Counter component inside the ISLAND tag is interactive
D. Only the heading is interactive

Solution

  1. Step 1: Identify ISLAND usage

    The Counter component is wrapped inside the ISLAND tag, marking it interactive.
  2. Step 2: Understand static vs interactive parts

    The heading and paragraph are outside ISLAND, so they remain static and non-interactive.
  3. Final Answer:

    Only the Counter component inside the ISLAND tag is interactive -> Option C
  4. Quick Check:

    ISLAND wraps interactive parts only [OK]
Hint: Only components inside <ISLAND> are interactive [OK]
Common Mistakes:
  • Assuming whole page is interactive
  • Thinking ISLAND tag is invalid
  • Believing static parts become interactive
4. What is wrong with this Fresh island component usage?
export default function Page() {
  return (
    <main>
      <ISLAND><Button /></ISLAND>
      <ISLAND><Button /></ISLAND>
    </main>
  );
}
medium
A. ISLAND tags must be self-closing
B. Using multiple ISLAND tags with the same component can cause duplicate hydration issues
C. Button component cannot be used inside ISLAND
D. ISLAND tags must wrap only one element, not components

Solution

  1. Step 1: Analyze multiple ISLAND usage

    Using the same interactive component multiple times inside separate ISLAND tags can cause hydration conflicts if keys are missing.
  2. Step 2: Understand hydration uniqueness

    Each island needs a unique key or identifier to avoid duplicate hydration errors.
  3. Final Answer:

    Using multiple ISLAND tags with the same component can cause duplicate hydration issues -> Option B
  4. Quick Check:

    Duplicate islands need unique keys to avoid errors [OK]
Hint: Multiple identical islands need unique keys to avoid errors [OK]
Common Mistakes:
  • Thinking ISLAND tags must be self-closing
  • Believing components can't be inside ISLAND
  • Assuming ISLAND wraps only HTML elements
5. You want to optimize a Fresh page with many interactive buttons. Which approach best uses Islands architecture to improve performance?
hard
A. Use <ISLAND> tags only on static content to reduce JavaScript
B. Wrap all buttons together in a single <ISLAND> to hydrate them all at once
C. Do not use <ISLAND> tags and hydrate the entire page client-side
D. Wrap each button in its own <ISLAND> with unique keys to hydrate only needed parts

Solution

  1. Step 1: Understand hydration granularity

    Wrapping each button in its own ISLAND allows independent hydration, improving performance by loading only needed parts.
  2. Step 2: Importance of unique keys

    Assigning unique keys to each island prevents hydration conflicts and ensures smooth interactivity.
  3. Final Answer:

    Wrap each button in its own <ISLAND> with unique keys to hydrate only needed parts -> Option D
  4. Quick Check:

    Separate islands with keys = better performance [OK]
Hint: Use separate islands with unique keys for many interactive parts [OK]
Common Mistakes:
  • Grouping all buttons in one island causing unnecessary hydration
  • Not using ISLAND tags and hydrating whole page
  • Misusing ISLAND on static content
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard