New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details
Socket
Book a DemoSign in
Socket

vite-plugin-solid-svg

Package Overview
Dependencies
Maintainers
1
Versions
18
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

vite-plugin-solid-svg

Import SVG files as Solid.js Components

latest
Source
npmnpm
Version
0.8.1
Version published
Weekly downloads
8.3K
-19.62%
Maintainers
1
Weekly downloads
 
Created
Source

vite-plugin-solid-svg

Extend Vite with ability to use SVG files as Solid.js components.

Features:

  • SVGO optimization
  • Hot Module Replacement support
  • Support for ?component-solid query string
  • SSR

Currently supported Vite version:

4 or above

Install

yarn add --dev vite-plugin-solid-svg

pnpm i -D vite-plugin-solid-svg

Setup

// vite.config.js
import solidPlugin from 'vite-plugin-solid'
import solidSvg from 'vite-plugin-solid-svg'
import { defineConfig } from 'vite'

export default defineConfig({
  plugins: [solidPlugin(), solidSvg()],
})

typescript

vite adds its own definition for "*.svg" and defines them as string. As far as I know this cannot be overridden. So we have two options: put our types before those of vite, or use imports with querystring.

If you are using defaultAsComponent which is the default, you need to put our types definition before vite in the tsconfig.

// tsconfig.json
"compilerOptions": {
  "types": [
    "vite-plugin-solid-svg/types-component-solid"
    "vite/client",
  ],
},

if you change to defaultAsComponent=false, you should use a different type definition that only identifies an svg import as a solid component when it matches the querystring. And in this case, put it before "vite/client"

// tsconfig.json
"compilerOptions": {
  "types": [
    "vite-plugin-solid-svg/types",
    "vite/client"
  ],
},
import MyIcon from './my-icon.svg';     // <-- this will match vite module definition, and therefore identified as string
import MyIcon from './my-icon.svg?component-solid';     // <-- this will match the definition in this plugin, and therefore identified as Solid Component

Options

SolidSvg({
  /**
   * If true, will export as JSX component if `as` isn't specified.
   *
   * Otherwise will export as url, or as JSX component if '?as=component-solid'
   *
   */
  defaultAsComponent: true,

  svgo: {
    enabled: true, // optional, by default is true
    svgoConfig: <svgo config>  // optional, if defined, the file svgo.config.js is not loaded.
  }
})

If you need to configure svgo, you can also create a config file svgo.config.js in the project's root, following the instructions at svgo docs. The svgo.svgoConfig has precedence over the file.

Usage

Import as a Solid.js component:

import MyIcon from './my-icon.svg?component-solid';
// or './my-icon.svg' if `defaultAsComponent` is `true`
import MyIcon from './my-icon.svg';

const App = () => {
  return (
    <div>
        <h1> Title </h1>
        <MyIcon />
    </div>
  );
};

export default App;

To import all svg inside a folder, use import.meta.glob('@/svgs/*.svg', { as: 'component-solid' }). See Vite docs for more details.

const icons = import.meta.glob('./*.svg', { as: 'component-solid' })

/*
  icons = {
    icon1: () => import("./icon1.svg"),
    icon2: () => import("./icon2.svg")
  }
*/

const App = () => {
  const Icon1 = lazy(() => iconsDic.icon1())
  return (
    <div>
        <p>hello</p><Icon1 />
    </div>
  );
};

export default App;

Why

In a Solidjs + vite project, you can easily add an svg image using:

import iconUrl from './icon.svg'

const App = () => {
  return (
    <div>
      <img href={iconUrl}>
    </div>
  )
}

However the fill color of the image cannot be overriden. Importing the svg as a component solves this and allows css styles to cascade into the svg content. Furthermore there may be situations where you'll need to ensure the image has been fully loaded, for example, before starting an animation. This module gives you a component that you can control when it's loaded.

Credits

This plugin is based on the work from the following projects:

Keywords

vite-plugin

FAQs

Package last updated on 26 Mar 2024

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts