自学内容网 自学内容网

Vue2搭建基础架构(8)--- 使用svg-sprite-loader

说明

这里记录下自己在Vue2的项目使用svg-sprite-loader来全局使用svg雪碧图,方便以后直接使用。这里承接自己的博客Vue2搭建基础架构(7)— 使用vuex-persistedstate这篇博客,在该博客项目的基础上增加使用svg-sprite-loader。

svg-sprite-loader官方网站:https://gitcode.com/gh_mirrors/svg/svg-sprite-loader

安装svg-sprite-loader

命令如下,-D表示该依赖添加在package.json里面的devDependencies。

devDependencies下的依赖包,只是我们在本地或开发坏境下运行代码所依赖的,若发到线上,其实就不需要devDependencies下的所有依赖包;(比如各种loader,babel全家桶及各种webpack的插件等)只用于开发环境,不用于生产环境,因此不需要打包。

npm install svg-sprite-loader -D

在webstorm里面的Terminal输入npm install svg-sprite-loader -D命令安装该依赖。如下:
在这里插入图片描述
package.json会增加svg-sprite-loader版本号
在这里插入图片描述

使用svg-sprite-loader

在src目录下的assets文件夹下新建icons文件夹来存放svg图片。这里随便放了2个svg图片。
在这里插入图片描述
在vue.config.js添加如下代码:
在这里插入图片描述

代码如下:

const { defineConfig } = require('@vue/cli-service')
// 导入nodejs工具path模块
const path = require('path')

module.exports = defineConfig({
  transpileDependencies: true,
  configureWebpack: {
    resolve: {
      // 别名配置,配置@指向src
      alias: {
        '@': path.resolve(__dirname, 'src')
      },
      // 引入文件的时候,可以忽略掉以下文件后缀
      extensions: ['.js', '.mjs', '.vue', '.json', '.less', '.css']
    }
  },
  // svg图片配置
  chainWebpack(config) {
    // 修改当前项目默认的svg配置,排除我们刚设的icons目录
    config.module
        .rule('svg') // 自定义规则名称
        .exclude.add(path.resolve(__dirname,'src/assets/icons'))// 排除icons目录下的svg文件
        .end()
    // 新增一个规则名为icons的规则,使用svg-sprite-loader来添加icons里面的svg
    config.module
        .rule('icons') // 自定义规则名称
        .test(/\.svg$/) // 匹配后缀为.svg的文件
        .include.add(path.resolve(__dirname,'src/assets/icons'))// svg图标位置
        .end() // end()用来退到上层链式,即回到和include平级那层
        .use('svg-sprite-loader')
        .loader('svg-sprite-loader')
        .options({
          symbolId: 'icon-[name]' // 要制定下图标id,[name]就是读到的svg文件名
        })
        .end()
    }
})

这里向大家推荐使用一个vue-cli提供的命令vue inspect来查询,它可以用来查询所有的隐藏的webpack配置,因为我只要查rules相关的命令,所以只需要使用vue inspect --rules命令即可。如下:
在这里插入图片描述

配置好规则后,可以使用cmd.exe来查看刚刚项目配置的两个规则,一个规则名为svg的,一个规则名为icons的,命令如下:
在这里插入图片描述
不要在项目里面的Terminal控制台输入vue inspect --rule svg命令,否则会出现如下错误:
在这里插入图片描述

添加svg-icon组件和全局注册svg图标js文件

在这里插入图片描述

在components文件夹下新建一个svg-icon文件夹,在svg-icon文件夹下面创建一个index.vue写svg组件内容,代码如下:

<!--svg组件-->
<template>
  <svg
      :class="svgIconClass"
      aria-hidden="true"
  >
    <use :xlink:href="svgIconName" />
  </svg>
</template>

<script>
  export default {
    name: "SvgIcon",
    props: {
      // icon图标名称
      iconName: {
        type: String,
        required: true,
      },
      // class样式名称,如果svg标签需要添加class样式,那么就需要该属性来添加svg的样式
      className: {
        type: String,
        default: ''
      }
    },
    computed: {
      // svg图片名称计算属性
      svgIconName() {
        return `#icon-${this.iconName}`
      },
      // svg样式名称计算属性
      svgIconClass() {
        if (this.className) {
          return 'svg-icon ' + this.className
        } else {
          return 'svg-icon'
        }
      }
    }
  }
</script>

<style scoped>
  /*设置默认svg图标样式,不可删除,否则就会显示原图标样式*/
  .svg-icon {
    width: 1em;
    height: 1em;
    vertical-align: -0.15em;
    fill: currentColor;
    overflow: hidden;
  }
</style>

在src/assets/icons文件夹下新建一个index.js全局组件文件,代码如下:

import Vue from 'vue'
import SvgIcon from '@/components/svg-icon'// svg组件

// 全局注册svg组件
Vue.component('SvgIcon', SvgIcon)

// ./表示svg图标所在的文件夹icons,然后匹配icons文件夹下的的svg图标文件,如果你想把svg放在icons下的svg目录中,这里的./就得改为./svg
const svgRequire = require.context('./', false, /\.svg$/)
// 完成本地svg图标的导入
svgRequire.keys().forEach(svgIcon => svgRequire(svgIcon))

在main.js里面将svg注册的js文件引入
在这里插入图片描述

测试svg雪碧图

如果想要修改svg图片颜色,需要修改svg图片里面的fill属性改为currentColor,如下:
在这里插入图片描述
在views下home文件下的index.vue直接添加svg标签代码,如下:
在这里插入图片描述

浏览器结果如下,显示默认svg图片大小和颜色:
在这里插入图片描述

如果想要修改svg图片样式,增加一个class样式即可。代码如下:
在这里插入图片描述

浏览器结果如下:
发现图片大小和颜色都被改变了,效果达到了。
在这里插入图片描述

全局使用svg图片说明就到这里了。


原文地址:https://blog.csdn.net/weixin_48040732/article/details/144909887

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!