unplugin-icons

repository·main·Indexed 26 days ago

https://github.com/unplugin/unplugin-icons

A universal plugin that allows developers to access thousands of icons from various sets as on-demand components across different build tools and frameworks, including Vite, Webpack, Rollup, Rspack, esbuild, Nuxt, Next.js, Svelte, Astro, Vue 3, React, Qwik, and Ember. It supports Iconify icon data, custom collections, and raw SVG imports.

Tokens
7.9K
Snippets
26
Records
54
Agent score
88%

What's inside unplugin-icons

  1. Auto-import icons in React & Solid

    main

    To use icons in React or Solid without explicit imports, combine unplugin-icons with unplugin-auto-import. You can configure a custom prefix and extension. Type declarations are generated automatically.

    // vite.config.ts
    import AutoImport from 'unplugin-auto-import/vite'
    import IconsResolver from 'unplugin-icons/resolver'
    import Icons from 'unplugin-icons/vite'
    
    export default {
      plugins: [
        AutoImport({
          resolvers: [
            IconsResolver({
              prefix: 'Icon',
              extension: 'jsx',
            }),
          ],
        }),
        Icons({
          compiler: 'jsx', // or 'solid'
        }),
      ],
    }
    export function Component() {
      return (
        <div>
          <IconCarbonApps />
          <IconMdiAccountBox style="font-size: 2em; color: red" />
        </div>
      )
    }
  2. Configure unplugin-icons for Ember

    main

    Ember support works with both Vite and Webpack (via Embroider).

    Vite Configuration: Add the plugin to your vite.config.mjs alongside @embroider/vite and @rollup/plugin-babel.

    Webpack Configuration: Add the plugin to the webpackConfig.plugins array within ember-cli-build.js using compatBuild.

    TypeScript Support: Add unplugin-icons/types/ember to your tsconfig.json.

    // Vite
    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,
        }),
      ],
    })
  3. Configure unplugin-icons for Vite

    main

    Add the Icons plugin to your vite.config.ts file.

    // vite.config.ts
    import Icons from 'unplugin-icons/vite'
    import { defineConfig } from 'vite'
    
    export default defineConfig({
      plugins: [
        Icons({ /* options */ }),
      ],
    })
  4. Install unplugin-icons

    main

    Install the unplugin-icons plugin as a development dependency. Note that this package is ESM-only; ensure your project uses ES modules (e.g., by setting "type": "module" in your package.json or using .mjs extensions).

    npm i -D unplugin-icons
  5. Configure unplugin-icons with Build Tools

    main

    To use unplugin-icons, you must integrate it into your build tool's configuration file. The import path varies depending on the tool used (e.g., unplugin-icons/vite, unplugin-icons/webpack, etc.).

    // Vite
    import Icons from 'unplugin-icons/vite'
    
    // Rollup
    import Icons from 'unplugin-icons/rollup'
    
    // Webpack
    import Icons from 'unplugin-icons/webpack'
    
    // Rspack
    import Icons from 'unplugin-icons/rspack'
    
    // esbuild
    import Icons from 'unplugin-icons/esbuild'
  6. Configure unplugin-icons for Next.js

    main

    Next.js requires the plugin to be added via the webpack function in next.config.mjs. You must set the compiler to jsx and specify the jsx runtime (e.g., react).

    Important: When importing icons in Next.js, you must explicitly include the .jsx extension in the import path to ensure correct loading.

    // 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
      }
    }
    
    // Usage requirement:
    import IconArrowRight from '~icons/dashicons/arrow-right.jsx';
  7. Auto-import icons in Vue 3

    main

    To use icons in Vue 3 without explicit imports, combine unplugin-icons with unplugin-vue-components. This allows you to use icons directly in templates using the naming pattern {prefix}-{collection}-{icon}. Only the icons you actually use will be bundled in your final build.

    // vite.config.ts
    import Vue from '@vitejs/plugin-vue'
    import IconsResolver from 'unplugin-icons/resolver'
    import Icons from 'unplugin-icons/vite'
    import Components from 'unplugin-vue-components/vite'
    
    export default {
      plugins: [
        Vue(),
        Components({
          resolvers: [
            IconsResolver(),
          ],
        }),
        Icons(),
      ],
    }
    <template>
      <i-carbon-accessibility/>
      <i-mdi-account-box style="font-size: 2em; color: red"/>
    </template>
  8. Configure unplugin-icons for Svelte and SvelteKit

    main

    For SvelteKit or Svelte + Vite, add the plugin to vite.config.ts and set the compiler option to 'svelte'.

    TypeScript Support:

    • SvelteKit: Add import 'unplugin-icons/types/svelte' to src/app.d.ts.
    • Svelte + Vite: Add <reference types="unplugin-icons/types/svelte" /> to src/vite-env.d.ts.
    • Svelte 4: Use unplugin-icons/types/svelte4.
    • Svelte 3: Use unplugin-icons/types/svelte3.
    // vite.config.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',
        })
      ]
    })
  9. Configure unplugin-icons for Astro

    main

    Add the plugin to the vite.plugins array in astro.config.mjs. Set the compiler to 'astro' for standard Astro projects, or 'vue3' if using the @astrojs/vue integration.

    // Standard Astro
    import { defineConfig } from 'astro/config'
    import Icons from 'unplugin-icons/vite'
    
    export default defineConfig({
      vite: {
        plugins: [
          Icons({
            compiler: 'astro',
          }),
        ],
      },
    })
  10. Migrate from `vite-plugin-icons` to `unplugin-icons`

    main

    To upgrade from vite-plugin-icons to unplugin-icons, follow these three steps:

    1. Update dependencies: Replace vite-plugin-icons with unplugin-icons in your package.json.
    2. Update configuration:
      • Change the import from vite-plugin-icons to unplugin-icons/vite.
      • Replace ViteIconsResolver with IconsResolver from unplugin-icons/resolver.
    3. Update import paths: Change the prefix from virtual:vite-icons/ to ~icons/ (though virtual:icons still works in Vite, ~icons is the recommended standard).
    // 1. package.json
    - "vite-plugin-icons": "*"
    + "unplugin-icons": "^0.7.0"
    
    // 2. config file
    - import Icons, { ViteIconsResolver } from 'vite-plugin-icons'
    + import Icons from 'unplugin-icons/vite'
    + import IconsResolver from 'unplugin-icons/resolver'
    
    // 3. import paths
    - import IconComponent from 'virtual:vite-icons/collection/name'
    + import IconComponent from '~icons/collection/name'
  11. Install Iconify icon data

    main

    To use icons, you must install the icon data from Iconify. You have three options:

    1. Full Collection (Recommended): Installs all icon sets (~120MB). Only icons you actually use are bundled in production.
    2. Individual Icon Sets: Install only specific sets to keep your dev dependencies smaller (e.g., @iconify-json/mdi).
    3. Auto Install (Experimental): Configure the plugin to automatically install icon sets when they are imported.
  12. Configure unplugin-icons for Webpack

    main

    Add the Icons plugin to your webpack.config.mjs file. Note that this package is ESM-only and requires ES module syntax.

    // webpack.config.mjs
    import Icons from 'unplugin-icons/webpack'
    
    export default {
      /* ... */
      plugins: [
        Icons({ /* options */ }),
      ],
    }