packages/codemod/docs/IMAGE_MIGRATION.md
This guide explains how to migrate from Chakra UI v2 Image/Img components to the v3 Image component.
In Chakra UI v3, the Image component has been simplified by removing built-in
fallback functionality and consolidating the Img and Image components. The
fallback logic has been removed in favor of native browser behavior and external
solutions.
npx @chakra-ui/codemod@latest image <path>
This will automatically transform all Img and Image components in your
codebase.
The Img component has been renamed to Image for consistency.
Before (v2):
import { Img } from "@chakra-ui/react"
function App() {
return
}
After (v3):
import { Image } from "@chakra-ui/react"
function App() {
return <Image src="photo.jpg" alt="Photo" />
}
Changes:
Img → ImageImg → ImageThe fit prop has been renamed to objectFit to match the CSS property name.
Before (v2):
import { Image } from "@chakra-ui/react"
function App() {
return <Image src="photo.jpg" fit="cover" />
}
After (v3):
import { Image } from "@chakra-ui/react"
function App() {
return <Image src="photo.jpg" objectFit="cover" />
}
Changes:
fit → objectFitThe align prop has been renamed to objectPosition to match the CSS property
name.
Before (v2):
import { Image } from "@chakra-ui/react"
function App() {
return <Image src="photo.jpg" align="center" />
}
After (v3):
import { Image } from "@chakra-ui/react"
function App() {
return <Image src="photo.jpg" objectPosition="center" />
}
Changes:
align → objectPositionThe following fallback-related props have been removed in v3:
Before (v2):
import { Image } from "@chakra-ui/react"
function App() {
return (
<Image
src="photo.jpg"
fallbackSrc="https://via.placeholder.com/150"
alt="Photo"
/>
)
}
After (v3):
import { Image } from "@chakra-ui/react"
function App() {
return <Image src="photo.jpg" alt="Photo" />
}
⚠️ Breaking Change: The fallbackSrc prop is no longer supported. See
Handling Image Failures for alternatives.
Before (v2):
import { Image, Spinner } from "@chakra-ui/react"
function App() {
return <Image src="photo.jpg" fallback={<Spinner />} alt="Photo" />
}
After (v3):
import { Image } from "@chakra-ui/react"
function App() {
return <Image src="photo.jpg" alt="Photo" />
}
⚠️ Breaking Change: The fallback prop is no longer supported. See
Handling Image Failures for alternatives.
Before (v2):
import { Image } from "@chakra-ui/react"
function App() {
return (
<Image
src="photo.jpg"
fallbackSrc="placeholder.jpg"
ignoreFallback
alt="Photo"
/>
)
}
After (v3):
import { Image } from "@chakra-ui/react"
function App() {
return <Image src="photo.jpg" alt="Photo" />
}
Changes: The ignoreFallback prop is removed as fallback functionality no
longer exists.
Before (v2):
import { Image } from "@chakra-ui/react"
function App() {
return (
<Image
src="photo.jpg"
fallbackSrc="placeholder.jpg"
fallbackStrategy="onError"
alt="Photo"
/>
)
}
After (v3):
import { Image } from "@chakra-ui/react"
function App() {
return <Image src="photo.jpg" alt="Photo" />
}
Changes: The fallbackStrategy prop is removed as fallback functionality no
longer exists.
Before (v2):
import { Box, Image, Img } from "@chakra-ui/react"
function Gallery() {
return (
<Box>
<Image
src="photo2.jpg"
fit="contain"
fallbackSrc="placeholder2.jpg"
ignoreFallback={false}
alt="Photo 2"
/>
</Box>
)
}
After (v3):
import { Box, Image } from "@chakra-ui/react"
function Gallery() {
return (
<Box>
<Image
src="photo1.jpg"
objectFit="cover"
objectPosition="center"
alt="Photo 1"
/>
<Image src="photo2.jpg" objectFit="contain" alt="Photo 2" />
</Box>
)
}
Since fallback functionality has been removed, here are alternative approaches for handling image loading failures:
onError EventHandle image errors manually using the onError event:
import { Image } from "@chakra-ui/react"
import { useState } from "react"
function App() {
const [imgSrc, setImgSrc] = useState("photo.jpg")
return (
<Image
src={imgSrc}
onError={() => setImgSrc("placeholder.jpg")}
alt="Photo"
/>
)
}
Build a wrapper component with fallback logic:
import { Image as ChakraImage } from "@chakra-ui/react"
import { useState } from "react"
interface ImageWithFallbackProps {
src: string
fallbackSrc: string
alt: string
[key: string]: any
}
function ImageWithFallback({
src,
fallbackSrc,
alt,
...props
}: ImageWithFallbackProps) {
const [imgSrc, setImgSrc] = useState(src)
const [isError, setIsError] = useState(false)
const handleError = () => {
if (!isError) {
setIsError(true)
setImgSrc(fallbackSrc)
}
}
return <ChakraImage src={imgSrc} alt={alt} onError={handleError} {...props} />
}
// Usage
function App() {
return (
<ImageWithFallback
src="photo.jpg"
fallbackSrc="placeholder.jpg"
alt="Photo"
/>
)
}
Use the native `` element with better error handling:
import { chakra } from "@chakra-ui/react"
const StyledImg = chakra("img")
function App() {
return (
<picture>
<source srcSet="photo.webp" type="image/webp" />
<source srcSet="photo.jpg" type="image/jpeg" />
<StyledImg src="photo.jpg" alt="Photo" objectFit="cover" />
</picture>
)
}
Consider using specialized image libraries that provide more robust fallback and loading features:
The codemod automatically handles import updates:
// Before
import { Img } from "@chakra-ui/react"
// After
import { Image } from "@chakra-ui/react"
// Before
import { Img, Image, Box } from '@chakra-ui/react'
// After (Img import removed, merged with Image)
import { Image, Box } from '@chakra-ui/react'
// Before
import { Image, Box } from '@chakra-ui/react'
// After (no change needed)
import { Image, Box } from '@chakra-ui/react'
The following props are preserved and work the same way in v3:
src - Image source URLsrcSet - Responsive image sourcesalt - Alternative textwidth, height - Dimensionsloading - Native lazy loading ("lazy" | "eager")crossOrigin - CORS settingsreferrerPolicy - Referrer policyobjectFit, objectPosition, borderRadius, etc.)// These props work the same in both v2 and v3
<Image
src="photo.jpg"
alt="Photo"
width="200px"
height="200px"
loading="lazy"
crossOrigin="anonymous"
referrerPolicy="no-referrer"
borderRadius="md"
objectFit="cover"
/>
After running the codemod, review your code for:
fallback={<Spinner />}, implement
custom loading UIloading="lazy" for better
performanceAfter migration, test:
srcSet and responsive images workobjectFit and objectPosition work as expectedalt text is present and meaningfulSolution: Implement custom fallback logic using the onError event handler
or create a wrapper component (see
Handling Image Failures).
Solution: Use a parent container with conditional rendering:
import { Image, Skeleton } from "@chakra-ui/react"
import { useState } from "react"
function App() {
const [isLoaded, setIsLoaded] = useState(false)
return (
<Skeleton isLoaded={isLoaded}>
<Image src="photo.jpg" alt="Photo" onLoad={() => setIsLoaded(true)} />
</Skeleton>
)
}
fit and align props not workingSolution: These were renamed by the codemod. If the codemod didn't run,
manually rename them to objectFit and objectPosition.
If you encounter issues during migration: