JetBrains / svg-sprite-loader

Webpack loader for creating SVG sprites.
MIT License
2.01k stars 272 forks source link

How to define spriteFilename and outputPath ? #427

Open zecka opened 3 years ago

zecka commented 3 years ago

Current output

dist/manifest.json
dist/img/sprite.[hash].js
dist/img/sprite.svg

Expected output

dist/manifest.json
dist/img/icons.[hash].svg

Github repo issue

Here is a repo to reproduce this issue: https://github.com/zeckaissue/svg-sprite-loader-issue

My webpack config

/* eslint-env node */
const path = require("path");
const { WebpackManifestPlugin } = require("webpack-manifest-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const SpriteLoaderPlugin = require("svg-sprite-loader/plugin");
const glob = require("glob").sync;

module.exports = {
  entry: {
    sprite: glob(path.resolve(__dirname, "src/img/svg/*.svg")),
  },
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "[name].[hash].js",
  },
  resolve: {
    extensions: [".js", ".scss", ".json", "svg"],
    alias: {
      "@": path.resolve(__dirname, "src/"),
    },
  },
  optimization: {
    splitChunks: {
      chunks: "all",
    },
  },
  module: {
    rules: [
      {
        test: /src\/img\/svg\/.*\.svg$/,
        use: [
          {
            loader: "svg-sprite-loader",
            options: {
              extract: true,
              spriteFilename: "icons.[hash].svg",
              runtimeCompat: true,
              outputPath: "img/",
            },
          },
          "svg-transform-loader",
          "svgo-loader",
        ],
      },
    ],
  },
  plugins: [
    new CleanWebpackPlugin(),
    new WebpackManifestPlugin({
      publicPath: "",
    }),
    new SpriteLoaderPlugin({
      plainSprite: true,
    }),
  ],
};
Flight commented 3 years ago

Same issue here after updating to Webpack 5. Looks like critical, can't update our project to webpack 5 because of this...

joseareland commented 3 years ago

The same here, still no luck on finding a solution.

firestar300 commented 3 years ago

Same here :(

lauraferrandof commented 3 years ago

Same here 😢

Nialaren commented 2 years ago

same here :(

artemkliaus commented 1 year ago

same here :(

OZZlE commented 1 year ago

Not the same issue, I missread, but very worth knowing for other fellow googlers if they stumble on the same issue as me updating from webpack4 to webpack5, you cannout use 'style-loader' as it causes the css file to point to a '[non-existant-hash].svg' instead of 'icons.svg' which was configured like below

            {
                test : /\.svg$/,
                include : path.resolve( './assets/icons' ),
                use : [
                    {
                        loader : 'svg-sprite-loader',
                        options : {
                            extract : true,
                            spriteFilename : 'images/icons.svg',
                            esModule : false
                        }
                    },
                    'svgo-loader'
                ]
            },
            {
                test : /\.scss|\.css$/,
                use : [
                    {
                        loader : MiniCssExtractPlugin.loader, // <- fixes it
                        options : {
                            publicPath : '../'
                        }
                        // loader: 'style-loader', // <- caused the '[hash].svg' instead of 'icons.svg'
                    },
                    {
                        loader : 'css-loader'
                    },
                    {
                        loader : 'postcss-loader'
                    },
                    {
                        loader : 'sass-loader'

                    }
                ]
            },
AdelFattakhova commented 1 year ago

Still having this issue. Has anybody got any workaround?