Skip to content
Loader and plugin for generating an SVG symbol sprite
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github
src
test-app
.babelrc
.cz-config.js
.dockerignore
.eslintrc.js
.gitignore
.npmignore
.npmrc
.prettierrc
.travis.yml
CODE_OF_CONDUCT.md
LICENSE.md
README.md
docker-compose.yml
icon.png
jest.config.js
package.json

README.md

  SVG Symbol Sprite
Ultimate SVG Icon System

Module version Build Greenkeeper badge Prettier managed by semantic release

This project includes a webpack loader and plugin that can be used with the icon sprite loader to create a performant process for creating SVG sprites.

Install

npm install svg-symbol-sprite-loader

Configuration guide

The ultimate SVG icon system follows this workflow:

  1. SVGs are imported into your application using the webpack loader, they can be referenced by their ID.
  2. The imported SVGs are deduped, sorted, hashed and extracted by the webpack plugin.
  3. The package exports a localStorage cache loader for browser bundles that will import the emitted sprite. If the sprite contents change, the filename hash will change and the sprite loader will fetch the latest sprite.

ℹ️ See the test application for a complete application example

1. Configure - webpack.config.js

const SVGSymbolSprite = require('svg-symbol-sprite-loader')
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {

  // ...

  module: {
    rules: [
      {
        // The loader transforms imported SVGs in JS objects of SVG data that
        // can be used with any icon component
        test: /\.svg$/,
        use: [
          {
            loader: 'svg-symbol-sprite-loader',

            // optional: Provide a function which returns a customized symbol ID.
            // It receives the full file path as an argument
            options: {
              symbolId: filePath => `icon-${path.basename(filePath, '.svg')}`,
            },
          },
        ],
      },
      // ...
    ],
  },
    plugins: [
      // The plugin will append a script with the sprite hash to head
      // ⚠️ Order matters, the HTML plugin must be included before the SVG sprite
      // plugin so that the HTML plugin hooks are registered!
      new HtmlWebpackPlugin(),

      // The plugin extracts the imported SVGs into a separate sprite file,
      new new SVGSymbolSprite.Plugin({
        filename: `icon-sprite${process.env.NODE_ENV === 'production' ? '.[chunkhash]' : ''}.svg`
      }),
    ],
  }
}

2. Fetch - application source

import svgSymbolSpriteLoader from 'svg-symbol-sprite-loader'

// Call the sprite loader to fetch and cache the latest SVG sprite.
svgSymbolSpriteLoader({ useCache: process.env.NODE_ENV === 'production' })

3. Import - application source

import iconOne from './media/icon-one.svg'

  // ...
export default () => (
  <svg>
    <use href={`#${iconOne.id}`}>
  </svg>
)

SVG icon system motivation

  • Sprite only the SVG icons imported into your application.
  • Use local storage to cache sprites by content hash and only fetch a sprite when its content has changed.
  • Load sprites from CDN locations without the CORS issues of relative SVG imports.
  • Symbol sprites are very effective for creating an icon system. They allows svgs to be referenced by id, and don't require including viewbox attributes.

Contributing 😃

All contributions are greatly appreciated 👍🎉. To contribute please:

Thank You 🙏

Repo icon made by Smartline from www.flaticon.com is licensed by CC 3.0 BY
You can’t perform that action at this time.