All Projects → bensampaio → external-svg-sprite-loader

bensampaio / external-svg-sprite-loader

Licence: MIT license
A webpack loader and plugin that generate SVG sprites out of a collection of SVG files used in your JS and CSS files

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to external-svg-sprite-loader

gulp-boilerplate
🚀 A opinionated gulp boilerplate for individuals and teams
Stars: ✭ 18 (-70%)
Mutual labels:  svg-files, svg-sprites
Tile-Studio
Tile / Sprite / Map Editor
Stars: ✭ 59 (-1.67%)
Mutual labels:  sprite
Gulp Webpack Starter
Gulp Webpack Starter - fast static website builder. The starter uses gulp toolkit and webpack bundler. Download to get an awesome development experience!
Stars: ✭ 199 (+231.67%)
Mutual labels:  svg-sprites
vuepress-plugin-svg-icons
🔥 SVG sprite plugin for VuePress
Stars: ✭ 17 (-71.67%)
Mutual labels:  sprite
weather-icons
Free to use animated weather icons.
Stars: ✭ 341 (+468.33%)
Mutual labels:  svg-files
ZzSprite
Pixel Art Sprite Generator
Stars: ✭ 85 (+41.67%)
Mutual labels:  sprite
Hugo theme pickles
Modern, Simple and beautiful Hugo theme
Stars: ✭ 168 (+180%)
Mutual labels:  svg-sprites
Svg Sprite Loader
Webpack loader for creating SVG sprites.
Stars: ✭ 1,822 (+2936.67%)
Mutual labels:  sprite
2dset-jelly-sprite
#NVJOB 2D Set Jelly Sprite. Unity Asset.
Stars: ✭ 17 (-71.67%)
Mutual labels:  sprite
Simple Icons
SVG icons for popular brands
Stars: ✭ 12,090 (+20050%)
Mutual labels:  svg-files
Pocketsvg
Easily convert your SVG files into CGPaths, CAShapeLayers, and UIBezierPaths
Stars: ✭ 1,483 (+2371.67%)
Mutual labels:  svg-files
svg2vector
Online batch converter of SVG images to Android vector drawable XML resource files
Stars: ✭ 39 (-35%)
Mutual labels:  svg-files
project-cordon-sprites
Community driven CC0-1.0 pixel art repository for indie developers.
Stars: ✭ 66 (+10%)
Mutual labels:  sprite
Font Awesome
The iconic SVG, font, and CSS toolkit
Stars: ✭ 66,937 (+111461.67%)
Mutual labels:  svg-sprites
martine
martine converts image (jpg png) to Overscan, Screen or window for Amstrad CPC (and Plus series)
Stars: ✭ 18 (-70%)
Mutual labels:  sprite
Feathericon
simply generic vector icon collection - including sketch file, svg files, and font files.
Stars: ✭ 178 (+196.67%)
Mutual labels:  svg-sprites
Sprite-Postprocessing-Tool-Unity
The post processing unity plugin that let's you create different effects for the unity UI image/Sprite renderer component.
Stars: ✭ 20 (-66.67%)
Mutual labels:  sprite
SVGShellExtensions
Shell extensions for SVG files (Preview Panel, Thumbnail Icon, SVG Editor)
Stars: ✭ 79 (+31.67%)
Mutual labels:  svg-files
Svg Sprite
SVG sprites & stacks galore — A low-level Node.js module that takes a bunch of SVG files, optimizes them and bakes them into SVG sprites of several types along with suitable stylesheet resources (e.g. CSS, Sass, LESS, Stylus, etc.)
Stars: ✭ 1,648 (+2646.67%)
Mutual labels:  sprite
Spritesheet
Simple helper for creating sprite based animations for Monogame.
Stars: ✭ 27 (-55%)
Mutual labels:  sprite

External SVG Sprite

npm version Build Status

A loader and plugin for webpack that converts all your SVGs into symbols and merges them into a SVG sprite.

Important: There is a breaking change when moving from v3 to v4. Check the release notes.

Requirements

You will need NodeJS v6+, npm v3+ and webpack 4.

To make it work in older browsers, like Internet Explorer, you will also need SVG for Everybody or svgxuse.

Installation

npm i external-svg-sprite-loader

or

yarn add external-svg-sprite-loader

Options

Loader options

  • name - relative path to the sprite file (default: img/sprite.svg). The [contenthash] placeholder is supported.
  • iconName - name for the icon symbol (default: icon-[name]-[hash:5]).
  • publicPath - custom public path to be used instead of webpack output.publicPath. This option might be useful when your webpack output.publicPath is set to a different scheme/host/port (e.g.: when you use a CDN). This is because currently the SVG sprite cannot be served from another domain (read more).
  • svgoOptions - custom options to be passed to svgo. If you set this option then make sure you add { removeViewBox: false } to the plugins otherwise this loader won't work.

Plugin options

  • emit - determines if the sprite is supposed to be emitted (default: true). Useful when generating server rendering bundles where you just need the SVG sprite URLs but not the sprite itself.
  • sprite - SVG sprite options (default: {startX: 0, startY: 0, deltaX: 0, deltaY: 0, iconHeight: 50, rowWidth: 1000}). StartX and StartY - beginning sprite position, DeltaX and DeltaY - space between icons. IconHeight - Icon height in the sprite (just for the comfort).

Usage

If you have the following webpack configuration:

// webpack.config.js

import path from 'path';

import SvgStorePlugin from 'external-svg-sprite-loader';

module.exports = {
    mode: 'development',
    module: {
        rules: [
            {
                loader: SvgStorePlugin.loader,
                test: /\.svg$/,
            },
        ],
    },
    output: {
        path: path.join(__dirname, 'public'),
        publicPath: '/',
    },
    plugins: [
        new SvgStorePlugin({
            sprite: {
                startX: 10,
                startY: 10,
                deltaX: 20,
                deltaY: 20,
                iconHeight: 20,
            },
        }),
    ],
};

You will be able to import your SVG files in your JavaScript files as shown below. The imported SVG will always correspond to a JavaScript object with keys symbol, view and viewBox:

  • The symbol url can be used on a <use> tag to display the icon;
  • The view url is supposed to be used in CSS;
  • The viewBox value is required by some browsers on the <svg> tag;
  • The title value can be used on the <svg> tag for accessibility.

The URLs will have the following format:

  • symbol: webpackConfig.output.publicPath/loader.name#loader.iconName
  • view: webpackConfig.output.publicPath/loader.name#view-loader.iconName
/*
 * {
 *  symbol: '/public/img/sprite.svg#icon-logo',
 *  view: '/public/img/sprite.svg#view-icon-logo',
 *  viewBox: '0 0 150 100',
 *  title: 'Logo'
 * }
 */
import logo from './images/logo.svg';

const Logo = () => (
   <svg viewBox={logo.viewBox} title={logo.title} role="img">
       <use xlinkHref={logo.symbol} />
   </svg>
);

In CSS files, you can import your SVG files as shown bellow (assuming you are using the MiniCssExtractPlugin). The imported value will be converted into the view url shown above.

.special-icon {
    /* the url will be replaced with the url to the sprite */
    background-image: url('./icons/special.svg') no-repeat 0;
}

When a SVG is added, removed or changed, the sprite will be re-generated and all files referencing it will be updated. When no [contenthash] is used in the name option, a cache-busting will be added to the URL so that the browser is forced to re-download the sprite.

Examples

You can find working examples in the examples folder. To test the React example under the examples/react folder run:

npm install
npm run start:dev

And then you can see the result in http://localhost:3000.

There's some additional commands that you may try:

  • npm run start:dev:hot to check if sprite updates work with Hot Module replacement.
  • npm run start:dev:no-hash to check if sprite updates work, even if the outputted file is the same.
  • npm run start:dev:hot-no-hash to check if sprite updates work with Hot Module replacement, even if the outputted file is the same.
  • npm run build:prd && npm run start:prd to test a production build.

Contributing

First of all, thank you for contributing, you are awesome.

Here are a few rules to follow in order to ease code reviews, and discussions before maintainers accept and merge your work:

  • Make sure your commit messages make sense (don't use fix tests, small improvement, fix 2, among others).
  • Before creating a pull request make sure of the following:
    • your code is all documented properly;
    • your code passes the ESLint rules;
    • variable, function and class names are explanatory enough;
    • code is written in ES2015.
  • When creating a pull request give it a name and description that are explanatory enough. In the description detail everything you are adding, do not assume we will understand it from the code.

Thank you!

License

MIT (http://www.opensource.org/licenses/mit-license.php)

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].