node package manager

svg-sprite-loader

SVG sprite loader

Webpack loader for creating SVG sprites.

ūüéČ 2.0 is out, please read the migration guide & overview.

‚ö†ÔłŹ For old v0.x versions of this loader, see the README in the v0 branch.

Table of contents

Why it's cool

  • Minimum initial configuration. Most of the options are configured automatically.
  • Runtime for browser. Sprites are rendered and injected in pages automatically, you just refer to images via <svg><use xlink:href="#id"></use></svg>.
  • Isomorphic runtime for node/browser. Can render sprites on server or in browser manually.
  • Customizable. Write/extend runtime module to implement custom sprite behaviour. Write/extend runtime generator to produce your own runtime, e.g. React component configured with imported symbol.
  • External sprite file generates sprites for images imported from css/scss/sass/less/styl/html (SVG stacking technique).

Installation

npm install svg-sprite-loader -D
# via yarn
yarn add svg-sprite-loader -D

Configuration

Example config:

// webpack 1 
{
  test: /\.svg$/,
  loader: 'svg-sprite-loader',
  query: { ... }
}
 
// webpack 1 multiple loaders 
{
  test: /\.svg$/,
  loaders: [
    `svg-sprite-loader?${JSON.stringify({ ... })}`,
    'svg-fill-loader',
    'svgo-loader'
  ]
}
 
// webpack 2 
{
  test: /\.svg$/,
  loader: 'svg-sprite-loader',
  options: { ... }
}
 
// webpack 2 multiple loaders 
{
  test: /\.svg$/,
  use: [
    { loader: 'svg-sprite-loader', options: { ... } },
    'svg-fill-loader',
    'svgo-loader'
  ]
}

symbolId (default [name])

How <symbol> id attribute should be named. Complete list of supported patterns: loader-utils#interpolatename docs.

esModule (default true, autoconfigured)

Generated export format:

  • when true loader will produce export default ....
  • when false the result is module.exports = ....

By default depends on used webpack version: true for webpack >= 2, false otherwise.

Runtime configuration

When you require an image, loader transforms it to SVG <symbol>, adds it to the special sprite storage and returns class instance that represents symbol. It contains id, viewBox and content fields and can later be used for referencing the sprite image, e.g:

import twitterLogo from './logos/twitter.svg';
// symbol === SpriteSymbol<id: string, viewBox: string, content: string> 
 
const rendered = `
<svg viewBox="${twitterLogo.viewBox}">
  <use xlink:href="#${twitterLogo.id}" />
</svg>`;

When browser event DOMContentLoaded is fired, sprite will automatically be rendered and injected in the document.body. If custom behaviour is needed (e.g. a different mounting point), you can override the default sprite:

import BrowserSprite from 'svg-baker-runtime/src/browser-sprite';
import domready from 'domready';
 
const sprite = new BrowserSprite();
domready(() => sprite.mount('#my-custom-mounting-point'));
 
export default sprite; // don't forget to export! 

spriteModule (autoconfigured)

Path to sprite module that will be compiled and executed at runtime. By default it depends on target webpack config option:

  • svg-sprite-loader/runtime/browser-sprite.build for 'web' target.
  • svg-sprite-loader/runtime/sprite.build for other targets.

If you need custom behavior, use this option to specify a path of your sprite implementation module. Path will be resolved relative to the current webpack build folder, e.g. utils/sprite.js placed in current project dir should be written as ./utils/sprite.

It's highly recommended to extend default sprite classes:

symbolModule (autoconfigured)

Same as spriteModule, but for sprite symbol. By default also depends on target webpack config option:

  • svg-sprite-loader/runtime/browser-symbol.build for 'web' target.
  • svg-sprite-loader/runtime/symbol.build for other targets.

runtimeCompat (default false)

Should runtime be compatible with earlier v0.x loader versions. This option will be removed in the next major version release.

runtimeGenerator (default generator)

Path to node.js script that generates client runtime. Use this option if you need to produce your own runtime, e.g. React component configured with imported symbol. Example.

runtimeOptions

Arbitrary data passed to runtime generator. Reserved for future use.

Extract configuration

In the extract mode loader should be configured with plugin, otherwise an error is thrown. Example:

// webpack.config.js 
const SpriteLoaderPlugin = require('svg-sprite-loader/plugin');
 
...
 
{
  plugins: [
    new SpriteLoaderPlugin()
  ]
}

extract (default false, autoconfigured)

Switches loader to the extract mode. Enabled automatically for images imported from css/scss/sass/less/styl/html files.

spriteFilename (default sprite.svg)

Filename of extracted sprite. Multiple sprites can be generated by specifying different loader rules restricted with include option. In case of any conflicts loader will produce a warning:

module: {
  rules: [
    // images from img/flags goes to flags-sprite.svg 
    {
      test: /\.svg$/,
      loader: 'svg-sprite-loader',
      include: path.resolve('./img/flags'), 
      options: {
        extract: true,
        spriteFilename: 'flags-sprite.svg'
      }
    },
    
    // images from img/icons goes to icons-sprite.svg 
    {
      test: /\.svg$/,
      loader: 'svg-sprite-loader',
      include: path.resolve('./img/icons'),
      options: {
        extract: true,
        spriteFilename: 'icons-sprite.svg'
      }
    }    
  ]
}

It is also possible to generate sprite for each chunk by using [chunkname] pattern in spriteFilename option. This is experimental feature, so use with caution!

Examples

See examples folder.

Contributing guidelines

TODO

License

MIT

Credits

TODO