安装 svg-sprite-loader 和 svgo-loader

    1. yarn add --dev svg-sprite-loader svgo-loader

    在项目根目录新建 vue.config.js

    1. const path = require('path')
    2. module.exports = {
    3. chainWebpack: (config) => {
    4. const dir = path.resolve(__dirname, 'src/assets/icons')
    5. config.module
    6. .rule('svg-sprite')
    7. .test(/\.svg$/) // 以.svg结尾
    8. .include.add(dir)
    9. .end() // 包含icons目录
    10. .use('svg-sprite-loader')
    11. .loader('svg-sprite-loader')
    12. .options({ extract: false })
    13. .end() // 配置svg-sprite-loader
    14. // 不需要去除颜色则注释掉
    15. // .use('svgo-loader')
    16. // .loader('svgo-loader')
    17. // .tap((options) => ({ ...options, plugins: [{ removeAttrs: { attrs: 'fill' } }] }))
    18. // .end()
    19. config.plugin('svg-sprite').use(require('svg-sprite-loader/plugin'), [{ plainSprite: true }]) // 配置插件
    20. config.module.rule('svg').exclude.add(dir) // 其他svg loader排除icons目录
    21. },
    22. }

    在eslintrc.js文件的 rules 里添加

    1. rules: {
    2. '@typescript-eslint/no-var-requires':0,
    3. },

    封装Icon组件

    1. <template>
    2. <div :class="icon_name">
    3. <svg class="icon" aria-hidden="true">
    4. <use :xlink:href="'#' + icon_name"></use>
    5. </svg>
    6. </div>
    7. </template>
    8. <script lang="ts">
    9. // eslint-disable-next-line no-undef
    10. const importAll = (requireContext: __WebpackModuleApi.RequireContext) => requireContext.keys().forEach(requireContext);
    11. try {importAll(require.context('../assets/icons', true, /\.svg$/));} catch (error) {console.log(error);}
    12. export default {
    13. props: {
    14. 'icon_name': {
    15. type: String,
    16. require: true
    17. }
    18. },
    19. }
    20. </script>
    21. <style lang="scss" scoped>
    22. .icon {
    23. width: 1em;
    24. height: 1em;
    25. vertical-align: -0.15em;
    26. fill: currentColor;
    27. overflow: hidden;
    28. }
    29. </style>

    icon_name由symbol的 id 决定
    image.png