Webpack loader for creating SVG sprites
npm install svg-sprite-loaderWebpack loader for creating SVG sprites.
> :tada: 2.0 is out, please read the migration guide & overview.
> :warning: For old v0.x versions see the README in the v0 branch.
- Why it's cool
- Installation
- Configuration
- symbolId
- symbolRegExp
- esModule
- Runtime configuration
- spriteModule
- symbolModule
- runtimeGenerator
- runtimeCompat (deprecated)
- runtimeOptions
- Extract configuration
- extract
- spriteFilename
- publicPath
- outputPath
- plainSprite
- spriteAttrs
- Examples
- Contributing guidelines
- License
- Credits
- 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 .
- 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 is generated for images imported from css/scss/sass/less/styl/html (SVG stacking technique).
``bash`
npm install svg-sprite-loader -Dvia yarn
yarn add svg-sprite-loader -D
`js
// webpack 1
{
test: /\.svg$/,
loader: 'svg-sprite-loader',
query: { ... }
}
// webpack 1 multiple loaders
{
test: /\.svg$/,
loaders: [
svg-sprite-loader?${JSON.stringify({ ... })},
'svg-transform-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-transform-loader',
'svgo-loader'
]
}
`
How id attribute should be named. All patterns from loader-utils#interpolateName
are supported. Also can be a function which accepts 2 args - file path and query string and return symbol id:
`js`
{
symbolId: filePath => path.basename(filePath)
}
Generated export format:
- when true loader will produce export default ....false
- when the result is module.exports = ....
By default depends on used webpack version: true for webpack >= 2, false otherwise.
When you require an image, loader transforms it to SVG , adds it to the special sprite storage and returns class instanceid
that represents symbol. It contains , viewBox and content (id, viewBox and url in extract mode)
fields and can later be used for referencing the sprite image, e.g:
`js
import twitterLogo from './logos/twitter.svg';
// twitterLogo === SpriteSymbol
// Extract mode: SpriteSymbol
const rendered = ;`
When browser event DOMContentLoaded is fired, sprite will be automatically rendered and injected in the document.body.spriteModule
If custom behaviour is needed (e.g. a different mounting target) default sprite module could be overridden via option. Check example below.
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.
Example of sprite with custom mounting target (copypasted from browser-sprite):
`js
import BrowserSprite from 'svg-baker-runtime/src/browser-sprite';
import domready from 'domready';
const sprite = new BrowserSprite();
domready(() => sprite.mount('#my-custom-mounting-target'));
export default sprite; // don't forget to export!
`
It's highly recommended to extend default sprite classes:
- for browser-specific env
- for isomorphic env
Same as spriteModule, but for sprite symbol. By default also depends on target webpack config option:svg-baker-runtime/browser-symbol
- for 'web' target.svg-baker-runtime/symbol
- for other targets.
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.
Should runtime be compatible with earlier v0.x loader versions. This option will be removed in the next major version release.
Arbitrary data passed to runtime generator. Reserved for future use when other runtime generators will be created.
In the extract mode loader should be configured with plugin, otherwise an error is thrown. Example:
`js
// webpack.config.js
const SpriteLoaderPlugin = require('svg-sprite-loader/plugin');
...
{
plugins: [
new SpriteLoaderPlugin()
]
}
`
Switches loader to the extract mode.
Enabled automatically for images imported from css/scss/sass/less/styl/html files.
Filename of extracted sprite. Multiple sprites can be generated by specifying different loader rules restricted with include option or
by providing custom function which recieves SVG file absolute path, e.g.:
`jssprite${svgPath.substr(-4)}
{
test: /\.svg$/,
loader: 'svg-sprite-loader',
options: {
extract: true,
spriteFilename: svgPath => `
}
}
[hash] in sprite filename will be replaced by it's content hash.[chunkname]
It is also possible to generate sprite for each chunk by using pattern in spriteFilename option. This is experimental feature, use it with caution!
Custom public path for sprite file.
`js`
{
test: /\.svg$/,
loader: 'svg-sprite-loader',
options: {
extract: true,
publicPath: '/'
}
}
Custom output path for sprite file.
By default it will use publicPath.
This param is useful if you want to store sprite is a directory with a custom http access.
`js`
{
test: /\.svg$/,
loader: 'svg-sprite-loader',
options: {
extract: true,
outputPath: 'custom-dir/sprites/'
publicPath: 'sprites/'
}
}
You can render plain sprite in extract mode without styles and usages. Pass plainSprite: true option to plugin constructor:
`js`
{
plugins: [
new SpriteLoaderPlugin({ plainSprite: true })
]
}
Sprite
`js``
{
plugins: [
new SpriteLoaderPlugin({
plainSprite: true,
spriteAttrs: {
id: 'my-custom-sprite-id'
}
})
]
}
See examples folder.
See CONTRIBUTING.md.
See LICENSE
Huge thanks for all this people.
[npm-url]: https://www.npmjs.com/package/svg-sprite-loader
[version-img]: https://img.shields.io/npm/v/svg-sprite-loader.svg?style=flat-square
[versions-img]: https://libraries.io/npm/svg-sprite-loader/versions
[downloads-img]: https://img.shields.io/npm/dm/svg-sprite-loader.svg?style=flat-square
[deps-url]: https://david-dm.org/JetBrains/svg-sprite-loader
[deps-img]: https://img.shields.io/david/JetBrains/svg-sprite-loader.svg?style=flat-square
[dev-deps-url]: https://david-dm.org/JetBrains/svg-sprite-loader?type=dev
[dev-deps-img]: https://img.shields.io/david/dev/JetBrains/svg-sprite-loader.svg?style=flat-square
[ci-url]: https://travis-ci.org/JetBrains/svg-sprite-loader
[ci-img]: https://img.shields.io/travis/JetBrains/svg-sprite-loader.svg?style=flat-square
[docs-coverage-url]: https://inch-ci.org/github/JetBrains/svg-sprite-loader
[docs-coverage-img]: https://inch-ci.org/github/JetBrains/svg-sprite-loader.svg?branch=master&style=flat-square