svg-sprite-loader icon indicating copy to clipboard operation
svg-sprite-loader copied to clipboard

Doesn't work with Laravel Mix

Open SasSam opened this issue 5 years ago • 2 comments

I try to use Laravel Mix (v5.0.4) and extend it with SVG sprite loader to generate SVG sprite. I have the following folder structure:

resources/
  images/
    image.jpg
  sass/
    app.scss
  svg/
    file1.svg
    file2.svg

webpack.sprite.js
webpack.mix.js

The content of webpack.mix.js:

const mix = require('laravel-mix');
require('./webpack.sprite');

const toCss = 'public/css';

mix.sass('resources/sass/app.scss', toCss)
   .options({
       sassOptions: {
           outputStyle: 'nested',
       }
   })
   .sprite();

The content of webpack.sprite.js:

const mix = require('laravel-mix');
const SpriteLoaderPlugin = require('svg-sprite-loader/plugin');
const path = require('path');

class Sprite {
    dependencies() {
        return ['svg-sprite-loader'];
    }

    webpackPlugins() {
        return new SpriteLoaderPlugin({plainSprite: true});
    }

    webpackRules() {
        return {
            test: /\.svg$/,
            include: path.resolve(__dirname, 'resources', 'svg'),
            use: [
                {
                    loader: 'svg-sprite-loader',
                    options: {
                        extract: true,
                        spriteFilename: path.resolve(__dirname, 'resources', 'images') + 'sprite.svg',
                        runtimeCompat: true
                    }
                },
                'svg-transform-loader',
                'svgo-loader'
              ]
        };
    }
}

mix.extend('sprite', new Sprite());

It does NOTHING in regards sprite, but it generates the CSS from SASS! :( I don't know why... Tried to "debug" it with some console.log() in the extension and it was hit, I saw the log messages in the console. But the sprite wasn't generated.

I also tried to use just hardcoded, relative paths in the extension without path. Didn't help.

Any idea?

Thanks in advance!

  • Node.js version: v12 LTS
  • webpack version: v4
  • svg-sprite-loader version: Latest stable
  • OS type & version: Win10

https://stackoverflow.com/questions/62517625/svg-sprite-issue-with-laravel-mix

SasSam avatar Jul 02 '20 09:07 SasSam

I have the same issue. Does anyone have any suggestion.

nikosdrog avatar Feb 19 '21 15:02 nikosdrog

For all poor souls coming across this issue:

There is a working implementation of svg-sprite-loader for laravel mix: https://github.com/swisnl/laravel-mix-svg-sprite

Installation:

yarn add laravel-mix-svg-sprite

Configuration

Example webpack.mix.js:

let mix = require('laravel-mix');
require('laravel-mix-svg-sprite');


/**
 * @see https://laravel-mix.com/docs/6.0/api
 */

mix.js('assets/js/custom.js', '')
    .sass('assets/scss/style.scss', '')
    .options({
        processCssUrls: false
    })
    .svgSprite(
        'assets/img',
        'sprite.svg',
        {
            extract: false // set to FALSE if the sprite should be loaded dynamically
        }
    )
    .sourceMaps(false)
    .setPublicPath('assets/dist');

Setting extract to true will only generate the svg file and you're resposible for importing it manually. Webpack can load it dynamically for you (just like intended by JetBrains) if you set it to false.

oliver-la avatar Aug 04 '21 09:08 oliver-la