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 #personal #musings #events #learning #technical #work #meta