auto-svg-component-generator v1.0.4
AutoSvgComponentGenerator
AutoSvgComponentGenerator is a generator that automatically converts .svg files into React components. AutoSvgComponentGenerator automatically generates index.tsx or index.jsx in React component format when .svg files are added, moved, modified or deleted.
Installation
// use npm
npm install --save-dev auto-svg-component-generator
// use yarn
yarn add --D auto-svg-component-generatorNaming Convention
SVG components are generated based on the svg file name, and the naming convention for generating SVG components is as follows:
ico-react.svg => SvgIcoReactAuto-generated Types
SvgComponentGenerator automatically generates not only components but also useful types whenever .svg files are added, moved, deleted, or modified.
- Type generation for file names
export type StaticSvgIconName = 'ico-close' | 'ico-search' | 'next' | 'react' | 'vercel';- Type generation for SVG component names
export type SvgComponentName = 'SvgIcoClose' | 'SvgIcoSearch' | 'SvgNext' | 'SvgReact' | 'SvgVercel';Usage
webpack (nextjs, cra)
next.config.js
const { WebpackSvgComponentPlugin } = require('auto-svg-component-generator');
/** @type {import('next').NextConfig} */
module.exports = {
webpack: (config) => {
const fileLoaderRule = config.module.rules.find(rule => rule.test && rule.test.test('.svg'));
fileLoaderRule.exclude = /\.svg$/;
// svgr configuration
config.module.rules.push({
loader: '@svgr/webpack',
options: {
prettier: false,
svgo: true,
svgoConfig: {
plugins: [
{
name: 'removeViewBox',
active: false
}
]
},
titleProp: true
},
test: /\.svg$/
});
config.plugins.push(new WebpackSvgComponentPlugin({
svgFileDir: './public/svgs',
useSvgr: true // Please set it to true when using svgr.
}))
return config;
}
};vite
vite.config.js
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react-swc'
import { viteSvgComponentPlugin } from 'auto-svg-component-generator'
export default defineConfig({
plugins: [
react(),
viteSvgComponentPlugin({
svgFileDir: 'src/assets/svgs',
typescript: true
})],
})AutoSvgComponentGenerator Options
| Option | Type | Default | Description |
|---|---|---|---|
| svgFileDir | string | - (Required) | Directory path where project's .svg files are stored |
| outputDir | string | svgFileDir | Output directory path where converted components will be stored. Default is svgFileDir |
| typescript | boolean | false | Sets whether to use TypeScript. If true, generates index.tsx file and types/index.d.ts. If false, generates index.jsx |
| useSvgr | boolean | false | Sets whether to use svgr. If true, generates components using svgr. If false, doesn't use svgr |
| title | boolean | false | Sets whether to show the title tag of svg files. If true, shows the title tag. If false, doesn't show the title tag (ignored when useSvgr: true) |
| description | boolean | false | Sets whether to show the desc tag of svg files. If true, shows the desc tag. If false, doesn't show the desc tag (ignored when useSvgr: true) |
| svgo | Omit<SvgConfig, 'path'> | undefined | Sets svgo options when useSvgr is false (ignored when useSvgr: true) |
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react-swc'
import { viteSvgComponentPlugin } from 'auto-svg-component-generator'
export default defineConfig({
plugins: [
react(),
viteSvgComponentPlugin({
svgFileDir: 'src/assets/svgs',
title: true,
description: true,
svgo: {
plugins: [
{
name: 'removeViewBox',
active: false
}
]
}
})],
})Cautions!
- For
vite, version4.0.0or higher is required. - For
next.js, you must usewebpackinnext.config.js. (turbopackis not supported.) - When using the
useSvgroption, you must installsvgrand apply it to webpack before use. - It is recommended to use it with
svgr. (svgris relatively stable.) - When
useSvgristrue, thesvgo,title, anddescriptionoptions are ignored.
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago