Installations
npm install @foxyimg/nuxt-svg-icon
Developer Guide
Typescript
Yes
Module System
ESM
Node Version
20.10.0
NPM Version
10.2.3
Score
35.8
Supply Chain
66
Quality
73.5
Maintenance
50
Vulnerability
97.6
License
Releases
Unable to fetch releases
Contributors
Unable to fetch Contributors
Languages
TypeScript (92.05%)
Vue (6.41%)
JavaScript (1.54%)
Love this project? Help keep it running — sponsor us today! 🚀
Developer
jawngee
Download Statistics
Total Downloads
173
Last Day
1
Last Week
2
Last Month
22
Last Year
173
GitHub Statistics
MIT License
277 Commits
1 Branches
1 Contributors
Updated on Dec 01, 2024
Package Meta Information
Latest Version
1.0.1
Package Id
@foxyimg/nuxt-svg-icon@1.0.1
Unpacked Size
22.02 kB
Size
7.52 kB
File Count
11
NPM Version
10.2.3
Node Version
20.10.0
Published on
Dec 01, 2024
Total Downloads
Cumulative downloads
Total Downloads
173
Last Day
0%
1
Compared to previous day
Last Week
-50%
2
Compared to previous week
Last Month
37.5%
22
Compared to previous month
Last Year
0%
173
Compared to previous year
Daily Downloads
Weekly Downloads
Monthly Downloads
Yearly Downloads
Dependencies
3
Peer Dependencies
5
@foxyimg/nuxt-svg-icon
@foxyimg/nuxt-svg-icon
is a Nuxt module to load optimized SVG files as Vue components.
This is a fork of nuxt-svgo by Corey Psoinos with some modifications, mostly removing unnecessary CSS classes.
Install
1npx nuxi@latest module add @foxyimg/nuxt-svg-icon
Usage
Use the default configuration by adding '@foxyimg/nuxt-svg-icon'
to the modules
section of your Nuxt config.
1// nuxt.config.ts 2import { defineNuxtConfig } from 'nuxt' 3 4export default defineNuxtConfig({ 5 modules: ['@foxyimg/nuxt-svg-icon'], 6})
Then, in any .vue
file, import your asset and use it as a component:
1<template> 2 <div> 3 <IconHome class="text-xl" /> 4 </div> 5</template> 6 7<script setup lang="ts"> 8 import IconHome from '~/assets/icon-home.svg' 9</script>
Or, if you use vite, in any .vue
file, simply use your icon's name with svg-icon
prefix as component name:
1<template> 2 <div> 3 <SvgIconHome class="text-xl" /> 4 <!-- Or --> 5 <svg-icon-home class="text-xl" /> 6 </div> 7</template>
It automatically imports your icons from assets/icons/
folder by default. you can configure this by passing autoImportPath
in your config:
1// nuxt.config.ts 2import { defineNuxtConfig } from 'nuxt' 3 4export default defineNuxtConfig({ 5 modules: ['@foxyimg/nuxt-svg-icon'], 6 svgo: { 7 autoImportPath: './assets/other-icons/', 8 }, 9})
If you want to use auto import but you don't want to use the nuxt-icon
component (used by default), You can do so by using defaultImport: 'component'
:
1// nuxt.config.ts 2import { defineNuxtConfig } from 'nuxt' 3 4export default defineNuxtConfig({ 5 modules: ['@foxyimg/nuxt-svg-icon'], 6 svgo: { 7 defaultImport: 'component', 8 }, 9})
You can also use your own custom component instead of the built-in nuxt-icon
component using the customComponent
option.
This custom component must have icon
property, just like the nuxt-icon
component provided by @foxyimg/nuxt-svg-icon.
Example:
1// nuxt.config.ts 2import { defineNuxtConfig } from 'nuxt' 3 4export default defineNuxtConfig({ 5 modules: ['@foxyimg/nuxt-svg-icon'], 6 svgo: { 7 customComponent: 'YourComponent', 8 }, 9})
By default module registers all icons inside autoImportPath
globally. This may be unwanted behavior as it generates chunks for each icon to be used globally, which will result in huge amount of files if you have many icons. If you want to disable global registration simply use global: false
in module options:
1// nuxt.config.ts 2import { defineNuxtConfig } from 'nuxt' 3 4export default defineNuxtConfig({ 5 modules: ['@foxyimg/nuxt-svg-icon'], 6 svgo: { 7 global: false, 8 }, 9})
to disable auto importing, simply set autoImportPath
to false
:
1// nuxt.config.ts 2import { defineNuxtConfig } from 'nuxt' 3 4export default defineNuxtConfig({ 5 modules: ['@foxyimg/nuxt-svg-icon'], 6 svgo: { 7 autoImportPath: false, 8 }, 9})
Subfolders
The icons's component name will follow Nuxt's component prefix convention. Therefore, if prefix is turned on for your components, the component name for assets/icons/admin/badge.svg
, for example, will be svg-icon-admin-badge
:
1<svg-icon-admin-badge />
componentPrefix
You can change the default prefix (svg-icon
) to your custom prefix using componentPrefix
option:
1// nuxt.config.ts 2import { defineNuxtConfig } from 'nuxt' 3 4export default defineNuxtConfig({ 5 modules: ['@foxyimg/nuxt-svg-icon'], 6 svgo: { 7 componentPrefix: 'i', 8 }, 9})
1// in your template 2<template> 3 <div> 4 <i-home /> 5 </div> 6</template>
How it works
Vite
If your Nuxt app uses Vite, this module adds vite-svg-loader to the underlying Vite configuration. All due credit for vite-svg-loader
to its author, @jpkleemans.
We use a modified copy of this vite plugin for auto loading icons with extra control using a nuxt-icon
component.
Webpack
If your Nuxt app uses Webpack, this module adds vue-svg-loader and svgo-loader to the underlying Webpack configuration. As discussed in this issue, vue-svg-loader
uses version 1 of SVGO. vue-svg-loader
looks to be unmaintained, with the latest beta release more than 2 years old. We disable the SVGO functionality of vue-svg-loader
, instead relying on svgo-loader
to perform optimizations, essentially making vue-svg-loader
wrap the svg content in <template></template>
tags.
All due credit for vue-svg-loader
to its author, @damianstasik.
All due credit for svgo-loader
to its author, @svg.
Make sure peer dependencies of this module (vue-svg-loader
,svgo-loader
, vue-loader
) are installed if you are using webpack.
Configuration
Use your own custom SVGO options:
1// nuxt.config.ts 2import { defineNuxtConfig } from 'nuxt' 3 4export default defineNuxtConfig({ 5 modules: ['@foxyimg/nuxt-svg-icon'], 6 svgo: { 7 svgoConfig: { 8 multipass: true, 9 plugins: [ 10 { 11 name: 'preset-default', 12 params: { 13 overrides: { 14 // customize default plugin options 15 inlineStyles: { 16 onlyMatchedOnce: false, 17 }, 18 19 // or disable plugins 20 removeDoctype: false, 21 removeViewBox: false, 22 }, 23 }, 24 }, 25 ], 26 }, 27 }, 28})
Disable SVGO entirely:
1// nuxt.config.ts 2import { defineNuxtConfig } from 'nuxt' 3 4export default defineNuxtConfig({ 5 modules: ['@foxyimg/nuxt-svg-icon'], 6 svgo: { 7 svgo: false, 8 }, 9})
Import queries (Vite.js only)
Here are the possible queries when importing a SVG file:
url_encode
: loads optimized svg as data uri (uses svgo +mini-svg-data-uri
)raw
: loads contents as textraw_optimized
: loads optimized svg as textskipsvgo
: loads contents as a component (unoptimized, withoutnuxt-icon
)component
: loads optimized svg as a componentcomponentext
: loads optimized svg withnuxt-icon
component
for example:
1<template> 2 <div> 3 <IconHome /> 4 </div> 5</template> 6 7<script setup lang="ts"> 8 import IconHome from '~/assets/icon-home.svg?componentext' // the default 9</script>
Important note for url_encode
query
xmlns="http://www.w3.org/2000/svg"
attribute is required for uri data to work. in some rare cases, it may not be there. make sure it exists when using url_encode
query or the image will not be shown.
Usage with TypeScript
When importing a SVG component in TypeScript, you will get a "Cannot find module" error. In order to fix thix, you need to provide a type declaration to tell TypeScript how to handle SVG components. Here's an example, using a custom.d.ts
file at the application's root:
1// custom.d.ts 2declare module '*.svg' { 3 import type { DefineComponent } from 'vue' 4 const component: DefineComponent 5 export default component 6}
nuxt-icon
component
Originally copied over from the nuxt-icons module, but later heavily modified to support tree shaking and SSR. This is not intended to be used directly. However, you can import your icons directly and pass them to the component using the icon
prop.
Component props
icon
: the component thatnuxt-icon
will render as. this is used internally to provide control over the icon.width
: Any valid CSS width value. If width is provided but height is not, height will be set to auto.height
: Any valid CSS height value. If height is provided but width is not, width will be set to auto.fill
: Any valid CSS color value.stroke
: Any valid CSS color value.
The width
, height
, fill
, and stroke
props are optional and should not be used in favor of CSS classes or using something utility framework like Tailwind or UnoCSS. They are provided for convenience.
Development
- Run
pnpm dev:prepare
to generate type stubs. - Use
pnpm dev
to start playground in development mode.
Authors
Corey Psoinos
- Github: @cpsoinos
Javad Mnjd
- Github: @jd1378
Jon Gilkison
- Github: @jawngee
Show your support
Give a ⭐️ if this project helped you!
📝 License
Original nuxt-svgo
code copyright © 2024 Corey Psoinos.
Copyright © 2024 Jon Gilkison.
This project is MIT licensed.

No vulnerabilities found.

No security vulnerabilities found.