前言

在使用 svg 图标的时候,建议使用 svg 雪碧图的方式加载 svg 图标。使用 svg-sprite-loadersvgo-loader。这样就能想 iconfont 引入 svg 图标的方式进行使用了。
但是此时需要一个个地引入 svg 图标。而且不能用 import 引入,会在 webpack 打包的时候 treeshaking 掉,需要用 require 引入。
而且使用 svg 图标时候还要用 svg + use标签的方式使用,比较复杂。
常用的方式是封装一个 svg-icon (或者叫 svg-render)组件。自动批量加载 svg 图标。这样在使用的方式,直接组件➕图标name即可使用,简单方便。
svg-render 组件的封装方式如下,这里以 vue2 代码示例。

组件代码

  1. <template>
  2. <svg class="svg-icon" aria-hidden="true">
  3. <use :xlink:href="'#icon-' + name" />
  4. </svg>
  5. </template>
  6. <script>
  7. export default {
  8. name: "SvgIcon",
  9. props: {
  10. name: String,
  11. },
  12. };
  13. </script>
  14. <style lang="scss" scoped>
  15. .svg-icon {
  16. width: 1em;
  17. height: 1em;
  18. fill: currentColor;
  19. overflow: hidden;
  20. }
  21. </style>
  1. import SvgIcon from "./src/main.vue";
  2. SvgIcon.install = (Vue) => {
  3. const req = require.context("src/icons/svg", true, /\.svg$/);
  4. const importAll = (req) => req.keys().forEach(req);
  5. importAll(req);
  6. Vue.component(SvgIcon.name, SvgIcon);
  7. };
  8. export default SvgIcon;

webpack 配置

  1. module: {
  2. rules: [
  3. {
  4. test: /\.svg$/,
  5. include: [
  6. path.resolve(__dirname, "src/icons/svg")
  7. ],
  8. use: [
  9. {
  10. loader: "svg-sprite-loader",
  11. options: {
  12. symbolId: "icon-[name]"
  13. }
  14. },
  15. // {
  16. // loader: "svgo-loader",
  17. // options: {
  18. // plugins: [
  19. // {
  20. // name: "removeAttrs",
  21. // params: {
  22. // attrs: "fill"
  23. // }
  24. // }
  25. // ]
  26. // }
  27. // }
  28. ]
  29. }
  30. ]
  31. },

相关知识点

依赖管理 | webpack 中文文档
svg-sprite-loader
svgo-loader