Cassidy Williams

Software Engineer in Chicago

Cassidy's face

Importing SVG files as React components with Vite


Chances are if you’ve ever used create-react-app and you wanted to import an SVG file as a React component, you did something like this and it Just Worked™:

import { ReactComponent as Logo } from './logo.svg'

But, alas, if you have moved to using Vite more often, as I have, you can’t just do that.

Never fear, it’s still possible!

Enter vite-plugin-svgr

vite-plugin-svgr is a Vite plugin to transform SVGs into React components! It’s super intuitive to use:

npm install vite-plugin-svgr

Add it to your vite.config.js:

import svgr from 'vite-plugin-svgr'

export default {
  // ...
  plugins: [svgr()],
  // ...
}

And boom, you get your expected behavior!

// somewhere in your React + Vite app

import { ReactComponent as WhateverIcon } from "./icons/WhateverIcon.svg";

// ...

export default function SomeComponent() {
	return (
		<div>
			<WhateverIcon />
			Wow, I love icons, because I am a dweeb
		</div>
	);
}

This is particularly useful if you’re using a library like MUI and you need to use a custom icon, like so:

// somewhere in your React + Vite app

import { Box, IconButton, SvgIcon } from "@mui/material";
import { ReactComponent as WhateverIcon } from "./icons/WhateverIcon.svg";

// ...

export default function SomeComponent() {
	return (
		<Box>
			<IconButton aria-label="some icon">
				<SvgIcon>
					<WhateverIcon />
				</SvgIcon>
			</IconButton>
			Wow, I love icons, because I am a dweeb
		</Box>
	);
}

There’s other things you can do with vite-plugin-svgr, and there’s a list of options here.

Hope that’s helpful for ya, happy icon-ing!


View posts by tag

#advice #events #technical #learning #musings #work #meta #personal