npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@svg-use/webpack

v0.3.1

Published

Tools and bundler plugins for loading SVG images via use[href], for use in components.

Downloads

62

Readme

@svg-use/webpack

A webpack loader, for using SVG images via use[href] references. A thin wrapper around @svg-use/core.

Quick start

First, install the plugin, and the default React wrapper:

pnpm install --dev @svg-use/webpack
pnpm install @svg-use/react

Configure webpack

In your webpack config file (typically webpack.config.js):

{
  module: {
    rules: [
      {
        // Match assets such as `arrow.svg?svgUse`, making them compatible with `svg >
        // use[href]`. Emit a transformed SVG asset, and return a JS module
        // with all the relevant information.
        test: /\.svg$/i,
        resourceQuery: {
          and: [/svgUse/i, { not: [/noTheme/i] }],
        },
        // This loader chain ultimately returns JS code, and emits an asset
        type: 'javascript/auto',
        use: [
          {
            loader: '@svg-use/webpack',
            options: {
              // Customise to your heart's content
              svgAssetFilename: 'svgAssets/[name]-[contenthash].[ext]',
            },
          },
        ],
      },
      {
        // Assets without a theme, such as country flags.
        // Referenced as `icon.svg?svgUse&noTheme`
        test: /\.svg$/i,
        resourceQuery: {
          and: [/svgUse/i, /noTheme/i],
        },
        type: 'javascript/auto',
        use: [
          {
            loader: '@svg-use/webpack',
            options: {
              getThemeSubstitutions: null,
              svgAssetFilename: 'svgAssets/[name]-[contenthash].[ext]',
            },
          },
        ],
      },
    ];
  }
}

Optional: Configure TypeScript

If you are using TypeScript, you can get types for the default config by adding the following in a .d.ts file in your project. For example, you can include this in src/client.d.ts, or any other applicable place.

/// <reference types="@svg-use/webpack/client" />

Overriding default types

If you wish to override the default types, add a separate .d.ts file with your types. Then, reference that file in client.d.ts, prior to the built-in types

For example, suppose you have changed the signature of the factory function. Specify your own definitions, such as svg-use-overrides.d.ts:

declare module '*.svg' {
  export const Component: ReturnType<
    typeof import('./path/to/my/factory').myFactoryName
  >;
}

In client.d.ts:

/// <reference types="./svg-use-overrides.d.ts" />
/// <reference types="@svg-use/webpack/client" />

Use it in your components

import { Component as Arrow } from './arrow.svg?svgUse';
import { Component as ArrowNoTheme } from './arrow.svg?svgUse&noTheme';

const MyComponent = () => (
  <div>
    <Arrow color="currentColor" />
    <ArrowNoTheme />
  </div>
);

You can also create your own SVG use[href] wrappers, using the other named exports. This is how the default Component factory works under the hood:

import { url, id } from './arrow.svg?svgUse';
import { createThemedExternalSvg } from '@svg-use/react';

export const Arrow = createThemedExternalSvg({ url, id });

Worked example

Consult examples/webpack-react for a worked example. You can use this as a playground for understanding the transformations, as well as the different moving parts, isolated from your own application's configuration.

Options

svgAssetFilename?

optional svgAssetFilename: string

Default: [name]-[contenthash].[ext]

The output filename for the transformed SVG asset. Often useful if you are placing your assets under a specific path, for example to facilitate caching.

Uses the same syntax/replacements as webpack's native assetModuleFilename.

getSvgIdAttribute?

optional getSvgIdAttribute: (info: {filename?: string; existingId?: string;}) => string;

Specifies an id for the referenced <svg>, set as the id attribute on the root. An id is required in order for use[href] to work. A default is provided if this is not defined.

Options shared with @svg-use/core