Bird
Raised Fist0
Astroframework~8 mins

Image optimization with astro:assets - Performance & Optimization

Choose your learning style10 modes available
Performance: Image optimization with astro:assets
HIGH IMPACT
This affects page load speed by reducing image file sizes and improving rendering time for images.
Loading images on a webpage efficiently
Astro
---
import { getImage } from 'astro:assets';
const optimizedImage = await getImage({ src: '/images/photo.jpg', width: 800, format: 'webp' });
---
<img src={optimizedImage.src} alt="Photo" loading="lazy" decoding="async" />
Automatically resizes, converts to efficient formats, and lazy loads images to speed up rendering.
📈 Performance GainReduces image size by 50-80%, cuts LCP by 300-500ms, and defers offscreen images.
Loading images on a webpage efficiently
Astro
<img src="/images/photo.jpg" alt="Photo">
Loads full-size images without optimization, causing slow page loads and large data usage.
📉 Performance CostBlocks rendering until large images load, increasing LCP by several hundred milliseconds.
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
Unoptimized full-size imagesMinimalTriggers 1 reflow per image loadHigh paint cost due to large images[X] Bad
astro:assets optimized images with lazy loadingMinimalSingle reflow after image loadsLow paint cost with smaller images[OK] Good
Rendering Pipeline
astro:assets processes images at build time to generate optimized versions. The browser loads smaller, faster images, reducing layout and paint delays.
→Network Load
→Layout
→Paint
⚠️ BottleneckNetwork Load due to large unoptimized images
Core Web Vital Affected
LCP
This affects page load speed by reducing image file sizes and improving rendering time for images.
Optimization Tips
1Always use astro:assets to resize and convert images to modern formats like WebP.
2Enable lazy loading to defer offscreen images and reduce initial load time.
3Avoid loading full-size images directly to prevent slow LCP and high data usage.
Performance Quiz - 3 Questions
Test your performance knowledge
How does using astro:assets for images improve page load performance?
ABy disabling image loading until user clicks
BBy loading all images at full size immediately
CBy generating smaller, optimized images and lazy loading them
DBy converting images to GIF format
DevTools: Performance
How to check: Open DevTools > Performance tab > Record page load > Look for image load times and LCP event timing.
What to look for: Check if images load quickly and LCP occurs early; large image load times indicate poor optimization.

Practice

(1/5)
1. What is the main purpose of using the Image component from astro:assets in an Astro project?
easy
A. To automatically optimize images for size and format
B. To create image galleries manually
C. To write custom CSS for images
D. To upload images to a server

Solution

  1. Step 1: Understand the role of astro:assets

    The astro:assets package provides tools to optimize images automatically.
  2. Step 2: Identify the Image component's function

    The Image component serves images in optimized sizes and formats without manual work.
  3. Final Answer:

    To automatically optimize images for size and format -> Option A
  4. Quick Check:

    Image optimization = A [OK]
Hint: Remember: Image auto-optimizes images [OK]
Common Mistakes:
  • Thinking Image uploads images
  • Confusing styling with optimization
  • Assuming manual resizing is needed
2. Which of the following is the correct way to import the Image component from astro:assets in an Astro file?
easy
A. import Image from 'astro:assets';
B. import { Image } from 'astro:assets';
C. import Image from '@astro/image';
D. import { Image } from '@astro/image';

Solution

  1. Step 1: Recall the official import syntax

    The Image component is a named export from astro:assets, so it requires curly braces.
  2. Step 2: Match the correct import statement

    Only import { Image } from 'astro:assets'; uses named import and correct package name.
  3. Final Answer:

    import { Image } from 'astro:assets'; -> Option B
  4. Quick Check:

    Named import with braces = C [OK]
Hint: Use curly braces for named imports like Image [OK]
Common Mistakes:
  • Using default import without braces
  • Wrong package name '@astro/image'
  • Confusing default and named imports
3. Given the following Astro code snippet, what will be the rendered output in the browser?
---
import { Image } from 'astro:assets';
const photo = '../assets/photo.jpg';
---

medium
A. A syntax error due to wrong prop usage
B. A broken image link because the path is incorrect
C. An optimized image of width 400 pixels with alt text 'A mountain'
D. An image with original size ignoring width attribute

Solution

  1. Step 1: Understand Image behavior with src and width

    The Image component optimizes the image and respects the width prop to resize it.
  2. Step 2: Check alt text and path usage

    The alt text is provided correctly, and the relative path is valid for Astro assets.
  3. Final Answer:

    An optimized image of width 400 pixels with alt text 'A mountain' -> Option C
  4. Quick Check:

    Image optimization with width and alt = D [OK]
Hint: Width prop resizes image; alt improves accessibility [OK]
Common Mistakes:
  • Assuming width is ignored
  • Thinking relative paths break images
  • Confusing alt text with title
4. Identify the error in this Astro code using Image from astro:assets:
---
import { Image } from 'astro:assets';
const logo = '/images/logo.png';
---

medium
A. The src path should be relative, not absolute
B. Missing width or height props causes a runtime error
C. The alt attribute is required but missing
D. The import statement is incorrect

Solution

  1. Step 1: Check the src path format

    The Image component expects a relative path or imported asset, not an absolute URL path starting with '/'.
  2. Step 2: Verify other props and import

    The alt attribute is present, and the import is correct; width/height are optional but recommended.
  3. Final Answer:

    The src path should be relative, not absolute -> Option A
  4. Quick Check:

    Use relative paths for src = B [OK]
Hint: Use relative paths for images, not absolute URLs [OK]
Common Mistakes:
  • Using absolute paths starting with '/'
  • Assuming width is mandatory
  • Confusing import syntax
5. You want to serve an image with a blurred placeholder while it loads using astro:assets. Which of the following code snippets correctly implements this feature?
hard
A.
import { Image } from 'astro:assets';
const pic = '../assets/pic.jpg';

<Image src={pic} alt="Scenery" placeholder={true} width={600} height={400} />
B.
import Image from 'astro:assets';
const pic = '../assets/pic.jpg';

<Image src={pic} alt="Scenery" blur placeholder width={600} height={400} />
C.
import { Image } from 'astro:assets';
const pic = '../assets/pic.jpg';

<Image src={pic} alt="Scenery" placeholder="loading" width={600} height={400} />
D.
import { Image } from 'astro:assets';
const pic = '../assets/pic.jpg';

<Image src={pic} alt="Scenery" placeholder="blur" width={600} height={400} />

Solution

  1. Step 1: Check correct import and usage of Image

    The Image component must be imported as a named import from astro:assets.
  2. Step 2: Verify placeholder prop value

    The placeholder prop accepts string values like "blur" to enable blurred placeholders while loading.
  3. Step 3: Confirm syntax correctness

    import { Image } from 'astro:assets';
    const pic = '../assets/pic.jpg';
    
    <Image src={pic} alt="Scenery" placeholder="blur" width={600} height={400} />
    
    uses correct import, relative path, and placeholder="blur" which is the proper way.
  4. Final Answer:

    Code snippet with placeholder="blur" and named import -> Option D
  5. Quick Check:

    Use placeholder="blur" with named import = A [OK]
Hint: Use placeholder="blur" for blurred loading effect [OK]
Common Mistakes:
  • Using default import instead of named import
  • Passing placeholder as boolean instead of string
  • Using invalid placeholder values like "loading"
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