Vue Cli 3 不允许我在 Webpack 中处理 SVG

Vue Cli 3 is not allowing me to process SVG's in Webpack

对于 SVG 资源,Vue Cli 默认为 file-loader,但我想改用 svg-sprite-loader(以及其他一些)。

我更新了 vue.config.js 文件来执行此操作,它似乎仍然使用 file-loader。几乎就像它根本没有获取我的配置一样。

vue.config.js

module.exports = {
  configureWebpack: {
    module: {
      rules: [
        {
          test: /\.(svg)(\?.*)?$/,
          use: [
            {
              loader: 'svg-sprite-loader',
              options: {
                name: '[name]-[hash:7]',
                prefixize: true
              }
            },
            'svg-fill-loader',
            'svgo-loader'
          ]
        }
      ]
    }
  }
}

我的设置有问题吗?

我仍然将 SVG 文件作为 URL 字符串/路径导入到我的组件中,而它应该是具有属性的对象。

非常感谢。

我花了一段时间才找到解决方法。基本上你需要停止 .svg 上的文件加载器匹配。我发现最好的方法是使用 chainWebpack 并从文件加载器的测试方法返回 false。我已经包含了我的工作配置。

module.exports = {
  lintOnSave: false,
  configureWebpack: {
    module: {
      rules: [
        {
          test: /\.(svg)(\?.*)?$/,
          use: [
            {
              loader: 'svg-inline-loader',
              options: {
                limit: 10000,
                name: 'assets/img/[name].[hash:7].[ext]'
              }
            }
          ]
        }
      ]
    }
  },
  chainWebpack: config => {
    config.module
      .rule('svg')
      .test(() => false)
      .use('file-loader')
  }
}

Vue CLI 3.0 beta 的 Webpack 文档已更新,其中包含有关如何 replace an existing Base Loader 的示例。对于 svg-sprite-loader 这意味着您必须将以下配置添加到您的 vue.config.js:

chainWebpack: config => {
  config.module
    .rule('svg')
    .use('file-loader')
    .loader('svg-sprite-loader')
}

我正在使用 Vue CLI 3.0.3,这个配置适合我

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

module.exports = {
  lintOnSave: false,
  configureWebpack: {
    plugins: [
      new SpriteLoaderPlugin()
    ]
  },
  chainWebpack: config => {
    config.module.rules.delete('svg');

    config
      .entry('app')
      .clear()
      .add(path.resolve(__dirname, './src/main.ts'))

    config
      .entry('sprite')
      .add(...glob.sync(path.resolve(__dirname, `./src/assets/icons/*.svg`)));

    config.module.rule('svg')
      .test(/\.(svg)(\?.*)?$/)
      .use('file-loader')
      .loader('svg-sprite-loader')
      .options({
        extract: true,
        spriteFilename: 'icons.svg'
      })
  }
};

webpack 部分的 3.x 版本的 Vue CLI 文档建议使用如下内容:

// vue.config.js
module.exports = {
  chainWebpack: config => {
    const svgRule = config.module.rule('svg')

    // clear all existing loaders.
    // if you don't do this, the loader below will be appended to
    // existing loaders of the rule.
    svgRule.uses.clear()

    // add replacement loader(s)
    svgRule
      .use('vue-svg-loader')
      .loader('vue-svg-loader')
  }
}

甚至 vue-svg-loader configuration guide 也建议使用相同的方法。