VUE-cli3 использует загрузчик svg-sprite-loader

внешний интерфейс SVG Ресурсы изображений Vue.js

svg-sprite-loaderПлагин для автоматического создания из импортированных файлов svgsymbolтег и вставьте html, то вы сможете легко использовать в шаблоне технологию svg-sprite.

Преимущества использования svg-спрайта

Если вы не знаете, что такое svg-sprite, вы можете обратиться к статье Zhang Xinxu:Будущее должно быть жарким: внедрение технологии SVG Sprite

  • чистый код страницы
  • Можно многократно вызывать в любом месте, используя идентификатор
  • Каждая иконка SVG может менять размер и цвет.

Установить плагин

npm install svg-sprite-loader --save-dev

Для настройки веб-пакета добавьте загрузчик, который обрабатывает svg, в Vue.config.js:

const path = require('path')

function resolve(dir) {
  return path.join(__dirname, '.', dir)
}

module.exports = {
  chainWebpack: config => {
    config.module.rules.delete("svg"); //重点:删除默认配置中处理svg,
    //const svgRule = config.module.rule('svg')
    //svgRule.uses.clear()
    config.module
      .rule('svg-sprite-loader')
      .test(/\.svg$/)
      .include
      .add(resolve('src/icons')) //处理svg目录
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]'
      })
  },
  configureWebpack: () => ({
    // resolve: {
    //   alias: require('./alias.config').webpack
    // }
    // module: {
    //   rules: [{
    //     test: /\.svg$/,
    //     use: [{
    //       loader: "svg-sprite-loader",
    //       options: {
    //         symbolId: 'icon-[name]'
    //       }
    //     }]
    //   }]
    // }
  })
}

В это время я узнал, что он все еще не работает.bodyне видел вsymbolЭтикетка.

То есть через svg-sprite-loader нужно пройти только те файлы svg, которые мы ввели сами, затем эти файлы svg помещаются в одну директорию, я помещаю их в src/icons.

Затем вам нужно ввести требуемый svg, где он используется

import './src/icon/target.svg';

Перезапустил проект и наконец увидел его в htmlsymbolЭтикетка!

После настройки вы можете использовать его. Способ использования очень прост, по сравнению с оригинальным методом вставки svg иконок (img src или запись всего svg в html), использование svg-sprite проще и чище:


1
<svg><use xlink:href="#target" /></svg>

Ну, только одна такая строчка.xlink:hrefПросто передайте идентификатор svg в приведенном выше файле конфигурации, потому что в приведенном выше файле конфигурации мы напрямую используем имя файла какsymbol, поэтому переданный здесь идентификатор является именем файла svg значка, который вы хотите отобразить, не забудьте добавить#.

автоматический импорт

Вы обнаружите, что если вы хотите вставить сюда иконку, вам нужноimport, слишком хлопотно повторять этот процесс каждый раз, когда вы его используете, поэтому давайте позволим файлам svg в src/icons/svg/ импортироваться автоматически.

webpack может помочь нам сделать:

// requires and returns all modules that match
const requireAll = requireContext => requireContext.keys().map(requireContext);

// import all svg
const req = require.context('./assets/svg', true, /\.svg$/);
requireAll(req);

Пример кода:

Сначала введите import './icons/index' в main.ts,


icons/index.js, импортируйте все svg в icons/svg и зарегистрируйте глобальный компонент SvgIcon


//SvgIcon组件代码

<template>
  <svg :class="svgClass" aria-hidden="true">
    <use :xlink:href="iconName"/>
  </svg>
</template>

<script>
export default {
  name: 'SvgIcon',
  props: {
    iconClass: {
      type: String,
      required: true
    },
    className: {
      type: String,
      default: ''
    }
  },
  computed: {
    iconName() {
      return `#icon-${this.iconClass}`
    },
    svgClass() {
      if (this.className) {
        return 'svg-icon ' + this.className
      } else {
        return 'svg-icon'
      }
    }
  }
}
</script>

<style scoped>
.svg-icon {
  width: 1em;
  height: 1em;
  vertical-align: -0.15em;
  fill: currentColor;
  overflow: hidden;
}
</style>

Затем вы можете использовать сборку


оrequire.contextДля подробного использования вы можете обратиться к документации по веб-пакету:dynamic requires

Таким образом, всякий раз, когда мы изменяем или добавляем новый svg, пока файл находится в этом каталоге, плагин автоматически сгенерирует для нас соответствующий svg.symbolЯрлык, просто используй его