记录Vue2+webpack@3.6 项目,如何使用SvgIcon组件来显示svg图片?

前言:

我们这个项目是vue2的,但是没有使用vue-cli脚手架,使用的是webpack.config.js来设置打包文件的,但是有很多小白就会懵逼了,那我应该怎么配置svg的文件呢?之前学的都是在vue.config.js文件配置的(vue.config,js的配置就一大堆了我这里就不列出来了,只是配置不同,其他相同),直接进入主题,不扯那么多别的

正题

1. 首先得安装插件 svg-sprite-loader

复制代码
npm install svg-sprite-loader

说明svg-sprite-loader实际上是把所有的svg打包成一张雪碧图,再通过来显示你所需的icon

2. webpack.base.conf.js 文件配置

(没有的话可以找找有没有webpack.config.js文件)

js 复制代码
module.exports = {
    ...,
    module: {
        rules: [
            ...,
           {
            test: /\.svg$/,
            loader: "svg-sprite-loader",
            include: [resolve("src/icons")], //这个文件路径根据实际情况改变
            options: {
              symbolId: "icon-[name]" // 一定要加,要不然svg会无效
            }
          },
        ]
    }
}

这里有一个注意事项

如果存在file-loader的规则还需要更改路径,不然上面的配置会不生效,被这个加载器会改变svg文件的路径:

js 复制代码
module: {
     rules: [
          ...
          {
            test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
            loader: 'url-loader',
            options: {
              limit: 10000,
              name: utils.assetsPath('img/[name].[hash:7].[ext]')
            },
            exclude: [resolve("src/icons")] // 需要过滤掉这个文件夹下面的svg
          },
          ...
     ]
}

3.创建icons文件夹 src/icons

这个文件夹下存放svg矢量图和index.js

将需要使用到的svg文件放在src/icons/svg文件夹中

4.icons/index.js 全局注册svgIcon组件

js 复制代码
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon'// svg component

// register globally
Vue.component('svg-icon', SvgIcon)

const req = require.context('./svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)

console.log(requireAll(req))  //这里可以打印出来加载后的svg文件

如果不是这个解构,而是文件路径 那就是在webpack配置文件中的fileloader没有过滤

5.在main.js中引入icons/index.js文件

js 复制代码
import './icons'

6.封装SvgIcon组件

在components下创建SvgIcon.vue文件

js 复制代码
<template>
    <svg :class="svgClass" aria-hidden="true">
        <use :xlink:href="iconName" />
    </svg>
</template>
  
<script>

export default {
    name: 'SvgIcon',
    props: {
        name: {
            type: String,
            required: true
        },
        className: {
            type: String,
            default: ''
        }
    },
    computed: {
        iconName() {
            return `#icon-${this.name}`
        },
        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>

7.使用SvgIcon组件

以后使用只需把svg矢量图放在src/icons/svg文件夹中即可,传name就可(不能使用中文)

js 复制代码
<svg-icon name="logo" className="logo"></svg-icon>

控制台效果

相关推荐
mldong3 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排4 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60615 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角6 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!6 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰6 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi7 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen8 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马9 小时前
AI源码分析:拆解模型底层实现逻辑
前端
IT_陈寒9 小时前
React子组件莫名其妙重渲染?你可能漏了这个Hook
前端·人工智能·后端