# unplugin-icons
**Repository Path**: mirrors_unplugin/unplugin-icons
## Basic Information
- **Project Name**: unplugin-icons
- **Description**: ๐คน Access thousands of icons as components on-demand universally.
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2023-12-13
- **Last Updated**: 2026-01-26
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# unplugin-icons
[](https://www.npmjs.com/package/unplugin-icons)
Access thousands of icons as components **on-demand** universally.
### Features
- ๐ Universal
- ๐คน **Any** icon sets - ~150 popular sets with over 200,000 icons, logos, emojis, etc. Powered by [Iconify](https://github.com/iconify/iconify).
- ๐ฆ **Major** build tools - Vite, Webpack, Rollup, Nuxt, Rspack, etc. Powered by [unplugin](https://github.com/unjs/unplugin).
- ๐ **Major** frameworks - Vanilla, Web Components, React, Vue 3, Solid, Svelte, and more. [Contribute](./src/core/compilers).
- ๐ฑ **Any** combinations of them!
- โ๏ธ On-demand - Only bundle the icons you really use, while having all the options.
- ๐จ SSR / SSG friendly - Ship the icons with your page, no more FOUC.
- ๐ Stylable - Change size, color, or even add animations as you would with styles and classes.
- ๐ฅ [Custom icons](#custom-icons) - load your custom icons to get universal integrations at ease.
- ๐ฒ [Auto Importing](#auto-importing) - Use icons as components directly in your template.
- ๐ฆพ TypeScript support.
- ๐ [Browse Icons](https://icones.js.org/)
๐ก **Story behind this tool**: [Journey with Icons Continues](https://antfu.me/posts/journey-with-icons-continues) - a blog post by Anthony
> **`vite-plugin-icons` has been renamed to `unplugin-icons`**, see the [migration guide](#migration-from-vite-plugin-icons)
## Quick Start
### Basic Usage
Import icons using the convention `~icons/{collection}/{icon}` and use them as components. [Auto importing](#auto-importing) is also supported.
**React Example:**
```jsx
import IconAccessibility from '~icons/carbon/accessibility'
import IconAccountBox from '~icons/mdi/account-box'
function App() {
return (
)
}
```
**Vue Example:**
```vue
```
## Installation
> **Note**: This package is ESM-only. Make sure your project uses ES modules (`"type": "module"` in `package.json` or `.mjs` file extensions).
### Step 1: Install the Plugin
```bash
npm i -D unplugin-icons
```
### Step 2: Install Icon Data
We use [Iconify](https://iconify.design/) as the icons data source (supports 100+ icon sets).
> [!TIP]
> โจ **VS Code Users**: Install the [Iconify IntelliSense](https://marketplace.visualstudio.com/items?itemName=antfu.iconify) extension for inlay preview, auto-completion, and hover information.
**Option A: Install Full Collection** (Recommended for flexibility)
```bash
npm i -D @iconify/json
```
This installs all icon sets (~120MB). Only icons you actually use will be bundled in production.
**Option B: Install Individual Icon Sets**
Install only the icon sets you need:
```bash
npm i -D @iconify-json/mdi @iconify-json/carbon
```
**Option C: Auto Install** (Experimental)
Let `unplugin-icons` automatically install icon sets when you import them:
```ts
Icons({
autoInstall: true, // Auto-detects npm/yarn/pnpm
})
```
## Examples
Check out the [playgrounds page](./examples/README.md) to try examples online in StackBlitz.
Available examples:
- [Vite + Vue 3](examples/vite-vue3)
- [Vite + React](examples/vite-react)
- [Next.js](examples/next)
- [Nuxt 4](examples/nuxt4)
- [SvelteKit](examples/sveltekit)
- [Astro](examples/astro)
- And more...
## Configuration
This section covers how to configure `unplugin-icons` for different build tools and frameworks.
### Build Tools
Vite
```ts
// vite.config.ts
import Icons from 'unplugin-icons/vite'
export default defineConfig({
plugins: [
Icons({ /* options */ }),
],
})
```
Rollup
```ts
// rollup.config.js
import Icons from 'unplugin-icons/rollup'
export default {
plugins: [
Icons({ /* options */ }),
],
}
```
Webpack
```ts
// webpack.config.mjs
import Icons from 'unplugin-icons/webpack'
export default {
/* ... */
plugins: [
Icons({ /* options */ }),
],
}
```
Nuxt
Nuxt 2 and [Nuxt Bridge](https://github.com/nuxt/bridge)
```ts
// nuxt.config.ts
export default {
buildModules: [
['unplugin-icons/nuxt', { /* options */ }],
],
}
```
Nuxt 3/4
```ts
// nuxt.config.ts
export default defineNuxtConfig({
modules: [
['unplugin-icons/nuxt', { /* options */ }]
],
})
```
Or work with [unplugin-vue-components](https://github.com/unplugin/unplugin-vue-components) resolvers
```ts
import IconsResolver from 'unplugin-icons/resolver'
import ViteComponents from 'unplugin-vue-components/vite'
// nuxt.config.ts
export default defineNuxtConfig({
modules: [
'unplugin-icons/nuxt',
],
vite: {
plugins: [
ViteComponents({
resolvers: [
IconsResolver({/* options */}),
],
}),
],
},
})
```
See [the Nuxt example](examples/nuxt4) for a working example project.
Rspack
```ts
import Icons from 'unplugin-icons/rspack'
// rspack.config.mjs
export default defineConfig({
plugins: [
// ...
Icons({/* options */}),
]
})
```
Vue CLI
> **Note**: This package is ESM-only. You need to use `vue.config.mjs` with ES module syntax (requires `@vue/cli-service ^5.0.8`).
```ts
// vue.config.mjs
import Icons from 'unplugin-icons/webpack'
export default {
configureWebpack: {
plugins: [
Icons({ /* options */ }),
],
},
}
```
SvelteKit
Add to your `vite.config.ts`:
```ts
import { sveltekit } from '@sveltejs/kit/vite'
import Icons from 'unplugin-icons/vite'
import { defineConfig } from 'vite'
export default defineConfig({
plugins: [
sveltekit(),
Icons({
compiler: 'svelte',
})
]
})
```
Check instructions in the `Frameworks -> Svelte` section below if you faced module import errors.
See [the SvelteKit example](examples/sveltekit) for a working example project.
Svelte + Vite
Svelte support requires the `@sveltejs/vite-plugin-svelte` plugin:
```shell
npm i -D @sveltejs/vite-plugin-svelte
```
Add to your `vite.config.ts`:
```ts
import { svelte } from '@sveltejs/vite-plugin-svelte'
import Icons from 'unplugin-icons/vite'
import { defineConfig } from 'vite'
export default defineConfig({
plugins: [
svelte(),
Icons({
compiler: 'svelte',
}),
],
})
```
Check instructions in the `Frameworks -> Svelte` section below if you faced module import errors.
See [the Svelte + Vite example](examples/vite-svelte) for a working example project.
Next.js
> **Note**: This package is ESM-only. You need to use `next.config.mjs` with ES module syntax.
Add to your `next.config.mjs`:
```ts
// next.config.mjs
import Icons from 'unplugin-icons/webpack'
/** @type {import('next').NextConfig} */
export default {
reactStrictMode: true,
webpack(config) {
config.plugins.push(
Icons({
compiler: 'jsx',
jsx: 'react'
})
)
return config
}
}
```
Check instructions in the `Frameworks -> React` section below if you faced module import errors.
โ ๏ธ **Warning:** to import an icon is necessary to explicitly add the `.jsx` extension to the import path, so that Next.js knows how to load it, by example:
```ts
import IconArrowRight from '~icons/dashicons/arrow-right.jsx';
// ^-- write `.jsx` to avoid
// https://github.com/antfu/unplugin-icons/issues/103
// ...some code later
```
See [the Next.js example](examples/next) for a working example project.
esbuild
```ts
// esbuild.config.js
import { build } from 'esbuild'
import Icons from 'unplugin-icons/esbuild'
build({
/* ... */
plugins: [
Icons({
/* options */
}),
],
})
```
Astro
```ts
// astro.config.mjs
import { defineConfig } from 'astro/config'
import Icons from 'unplugin-icons/vite'
// https://astro.build/config
export default defineConfig({
vite: {
plugins: [
Icons({
compiler: 'astro',
}),
],
},
})
```
See [the Astro example](examples/astro) for a working example project.
Astro + Vue
Required [@astrojs/vue](https://docs.astro.build/es/guides/integrations-guide/vue/) installed.
```ts
import Vue from '@astrojs/vue'
// astro.config.mjs
import { defineConfig } from 'astro/config'
import Icons from 'unplugin-icons/vite'
// https://astro.build/config
export default defineConfig({
integrations: [
Vue(),
],
vite: {
plugins: [
Icons({
compiler: 'vue3',
}),
],
},
})
```
See [the Astro + Vue example](examples/astro-vue) for a working example project.
### Frameworks
Configure the `compiler` option based on your framework. Some frameworks may require additional peer dependencies.
Vue 3
**Configuration:**
```ts
Icons({ compiler: 'vue3' })
```
**Peer Dependency:**
> **Note**: As of Vue 3.2.13+, `@vue/compiler-sfc` is included in the main `vue` package, so no additional installation is needed.
If you're using an older version:
```bash
npm i -D @vue/compiler-sfc
```
**TypeScript Support:**
Add to your `tsconfig.json`:
```jsonc
{
"compilerOptions": {
"types": [
"unplugin-icons/types/vue"
]
}
}
```
See [the Vue 3 example](examples/vite-vue3) for a complete setup.
React
**Configuration:**
```ts
Icons({ compiler: 'jsx', jsx: 'react' })
```
**Peer Dependencies:**
```bash
npm i -D @svgr/core @svgr/plugin-jsx
```
**TypeScript Support:**
Add to your `tsconfig.json`:
```jsonc
{
"compilerOptions": {
"types": [
"unplugin-icons/types/react"
]
}
}
```
See [the React example](examples/vite-react) for a complete setup.
Preact
**Configuration:**
```ts
Icons({ compiler: 'jsx', jsx: 'preact' })
```
**Peer Dependencies:**
```bash
npm i -D @svgr/core @svgr/plugin-jsx
```
**TypeScript Support:**
Add to your `tsconfig.json`:
```jsonc
{
"compilerOptions": {
"types": [
"unplugin-icons/types/preact"
]
}
}
```
See [the Preact example](examples/vite-preact) for a complete setup.
Solid
**Configuration:**
```ts
Icons({ compiler: 'solid' })
```
**TypeScript Support:**
Add to your `tsconfig.json`:
```jsonc
{
"compilerOptions": {
"types": [
"unplugin-icons/types/solid"
]
}
}
```
See [the Solid example](examples/vite-solid) for a complete setup.
Svelte
**Configuration:**
```ts
Icons({ compiler: 'svelte' })
```
**TypeScript Support:**
**For SvelteKit**, add to `src/app.d.ts`:
```ts
import 'unplugin-icons/types/svelte'
```
**For Svelte + Vite**, add to `src/vite-env.d.ts`:
```ts
///
///
///
```
**For Svelte 4**, use:
```ts
///
```
**For Svelte 3**, use:
```ts
///
```
See [the Svelte example](examples/vite-svelte) for a complete setup.
Astro
**Configuration:**
```ts
Icons({ compiler: 'astro' })
```
**TypeScript Support:**
Add to your `tsconfig.json`:
```jsonc
{
"compilerOptions": {
"types": [
"unplugin-icons/types/astro"
]
}
}
```
See [the Astro example](examples/astro) for a complete setup.
Astro + Vue
**Configuration:**
```ts
Icons({ compiler: 'vue3' })
```
**Requirements:**
Requires [@astrojs/vue](https://docs.astro.build/es/guides/integrations-guide/vue/) to be installed.
**TypeScript Support:**
Add to your `tsconfig.json`:
```jsonc
{
"compilerOptions": {
"types": [
"unplugin-icons/types/vue"
]
}
}
```
See [the Astro + Vue example](examples/astro-vue) for a complete setup.
Qwik
**Option 1: Native Qwik Compiler** (Recommended)
**Configuration:**
```ts
Icons({ compiler: 'qwik' })
```
**Peer Dependency:**
```bash
npm i -D @svgx/core
```
**Option 2: JSX Compiler**
**Configuration:**
```ts
Icons({ compiler: 'jsx', jsx: 'qwik' })
```
**Peer Dependencies:**
```bash
npm i -D @svgr/core @svgr/plugin-jsx
```
**TypeScript Support:**
Add to your `tsconfig.json`:
```jsonc
{
"compilerOptions": {
"types": [
"unplugin-icons/types/qwik"
]
}
}
```
See [the Qwik example](examples/vite-qwik) for a complete setup.
Ember
**Configuration:**
```ts
Icons({ compiler: 'ember' })
```
**Build Tool Support:**
Ember works with either Webpack or Vite.
**For Vite applications**, add to `vite.config.mjs`:
```ts
import { ember, extensions } from '@embroider/vite'
import { babel } from '@rollup/plugin-babel'
import Icons from 'unplugin-icons/vite'
import { defineConfig } from 'vite'
export default defineConfig({
plugins: [
ember(),
Icons({
compiler: 'ember',
}),
babel({
babelHelpers: 'runtime',
extensions,
}),
],
})
```
**TypeScript Support:**
Add to your `tsconfig.json`:
```jsonc
{
"compilerOptions": {
"types": [
"unplugin-icons/types/ember"
]
}
}
```
Ember + Webpack
Assuming your app was generated with `--embroider`, or manually migrated to embroider following the instructions on [the old embroider readme](https://github.com/embroider-build/embroider/tree/stable?tab=readme-ov-file#how-to-try-it)
Add the Icon plugin to the webpack plugins array in `ember-cli-build.js`:
```ts
import { compatBuild } from '@embroider/compat'
import Icons from 'unplugin-icons/webpack'
return compatBuild(app, Webpack, {
packagerOptions: {
webpackConfig: {
plugins: [
Icons({
compiler: 'ember',
}),
],
},
},
// ...other options
```
See the [Ember (with Webpack)](examples/webpack-ember) or [Ember vite example](examples/vite-ember) for a working example project.
## Raw SVG Import
> Available from `v0.13.2+`
Import icons as raw SVG strings by adding `?raw` to the import path. Useful for embedding SVG directly in HTML templates.
**Example (Vue 3):**
```vue
import RawMdiAlarmOff from '~icons/mdi/alarm-off?raw&width=4em&height=4em'
{{ RawMdiAlarmOff }}
import RawMdiAlarmOff2 from '~icons/mdi/alarm-off?raw&width=1em&height=1em'
{{ RawMdiAlarmOff2 }}
```
## Custom Icons
Load your own custom icons and use them with the same universal API.
```ts
import { promises as fs } from 'node:fs'
// loader helpers
import { FileSystemIconLoader } from 'unplugin-icons/loaders'
Icons({
customCollections: {
// key as the collection name
'my-icons': {
account: '',
// load your custom icon lazily
settings: () => fs.readFile('./path/to/my-icon.svg', 'utf-8'),
/* ... */
},
'my-other-icons': async (iconName) => {
// your custom loader here. Do whatever you want.
// for example, fetch from a remote server:
return await fetch(`https://example.com/icons/${iconName}.svg`).then(res => res.text())
},
// a helper to load icons from the file system
// files under `./assets/icons` with `.svg` extension will be loaded as it's file name
// you can also provide a transform callback to change each icon (optional)
'my-yet-other-icons': FileSystemIconLoader(
'./assets/icons',
svg => svg.replace(/^