vue项目中自动导入svg并愉快的使用方式

目录
  • 引入图标的几种方式
    • 远古时代
    • iconfont时代
    • svg时代
  • 处理loader,对指定目录svg文件处理
    • 安装loader
    • 配置vue.config.js
  • 接下来使用vue inspect看下目前的配置
  • 编写一个自定义组件
  • 编写一个js,实现svg自动化
  • 至此就可以愉快的使用svg了
    • 压缩优化

引入图标的几种方式

远古时代

  • 一个个小图标png图片引入,代码中在一个个引用
  • spirit图片,将多个图标放在一张png图片上,通过background属性显示对应的图标

iconfont时代

  • 将整个工程用到的图标,全部打包生成字体文件,在代码中全局引入,只要通过标签和class就能够使用

缺点:

  • 当新增图标的时候,需要重新生成字体文件,当团队开发的时候,新增图标就显得格外麻烦

svg时代

优势:

  • svg可以单独引入,不需要像iconfont一起打包
  • 封装一个全局组件,就能像iconfont一样,传入class名称就能显示对应svg图标

注意点:svg有兼容性问题,使用的时候先跟产品谈论清楚需求是否需要兼容ie

处理loader,对指定目录svg文件处理

安装loader

npm i svg-sprite-loader -D

配置vue.config.js

这里推荐一个vue指令,可以方便的查询vue隐藏的配置文件的loader规则

vue inspect --rule svg

接下来上配置文件

找到vue.config.js 如果没有就新建一个

const path = require("path");
// 引入path模块
const resolve = dir => path.join(__dirname, dir);

module.exports = {
  ...,
  // 配置路径别名
  chainWebpack: config => {
    // vue inspect --rule svg  // 使用以上指令,可以获取vue配置的loader规则
    // svg loader 取消src/icons目录下的处理
    config.module.rule("svg").exclude.add(resolve("src/icons"));
    // 添加自定义loader规则 icons,只处理src/icons目录
    config.module
      .rule("icons")
      .test(/\.svg$/)
      .include.add(resolve("src/icons")) // 上下文变化
      .end() // 返回上下文
      .use("svg-sprite-loader")
      .loader("svg-sprite-loader")
      .options({ symbolId: "icon-[name]" });
  },
  ...
};

主要有以下几点:

  • 将svg默认规则绕开我们自定义的目录 src/icons
  • 创建自定义规则icons,包含我们的自定义目录src/icons
  • 配置svg使用名称规则, icon-[文件名]

接下来使用vue inspect看下目前的配置

vue inspect --rule svg

/* 以下是我们修改后的svg loader规则 */
/* config.module.rule('svg') */
{
  test: /\.(svg)(\?.*)?$/,
  exclude: [
    '/Users/{UserName}/project/src/icons' /* 这个是不包含的目录 */
  ],
  use: [
    /* config.module.rule('svg').use('file-loader') */
    {
      loader: '/Users/{UserName}/project/node_modules/file-loader/dist/cjs.js',
      options: {
        name: 'img/[name].[hash:8].[ext]'
      }
    }
  ]
}

vue inspect --rule icons

// 以下是我们添加的icons loader规则
/* config.module.rule('icons') */
{
  test: /\.svg$/,
  include: [
    '/Users/{UserName}/project/src/icons' /* 这个是包含的目录 */
  ],
  use: [
    /* config.module.rule('icons').use('svg-sprite-loader') */
    {
      loader: 'svg-sprite-loader',
      options: {
        symbolId: 'icon-[name]'
      }
    }
  ]
}

编写一个自定义组件

<template>
  <svg v-on="$listeners" :class="svgClass">
    <use :xlink:href="iconName" rel="external nofollow" ></use>
  </svg>
</template>
<script>
export default {
  name: "SvgIcon",
  props: {
    iconClass: {
      type: String,
      default: ""
    },
    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>

入参有2个,iconClass(图标的名称)和className(自定义样式名称)

iconClass为src/icon下目录的svg文件名称

编写一个js,实现svg自动化

import Vue from "vue";
import SvgIcon from "@/components/SvgIcon.vue";
const isEnv = process.env.NODE_ENV === "development";
// 自动加载 icons 目录下的所有svg
const req = require.context("./svg", true, /\.svg$/);
const svgNameSet = new Set();
req.keys().map(url => {
  const pathSplit = url.split("/");
  const fileName = pathSplit[pathSplit.length - 1];
  isEnv && console.log(fileName);
  if (svgNameSet.has(fileName)) {
    isEnv && console.error("图标名称重复,请检查");
  } else {
    svgNameSet.add(fileName);
    return req(url); // 可以用于异步require
  }
});

// 全局注册SvgIcon.vue组件
Vue.component("svg-icon", SvgIcon);

这个脚本主要有以下几个内容:

  • 全局注册SvgIcon.vue组件
  • 使用require.context("./svg", true, /\.svg$/);,对src/icons目录递归遍历,获取所有文件
  • 做一遍开发环境的重复提醒(因为这边使用的icon-[name],name是唯一的,所以当有相同文件名称的svg,会被覆盖)

至此就可以愉快的使用svg了

使用方法如下:

  • 将svg文件复制到src/icons目录下,比如diamond.svg
  • 在vue的template中直接使用 <svg-icon iconClass="diamond"></svg-icon>

是不是很简单,赶紧去试试吧

压缩优化

SVG通常会有一些冗余信息(如:fill=“red”, 还有可能导致无法修改颜色)导致影响体积,这里我们可以使用svgo-loader来进一步压缩

// install
npm i svgo-loader -D

// vue.config.js
// 接上面svg的配置
...
.end()
.use('svgo-loader')
.loader('svgo-loader')
.end()

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • vue动态加载SVG文件并修改节点数据的操作代码

    先上一个马赛克图片叭. 接领导需求,动态实现电路图, 并附带放大.缩小功能. 以及不同的回路点击能弹窗显示相关节点的更多信息, 通俗一点讲: 随着用户点击放大和缩小, 点击位置保持不变,而且能实现点击交互. 初接触的时候,觉得根本没法下手呀,说说自己的思路叭, 从随着用户点击放大缩小位置不变,想到了SVG 但是需要动态加载进来呀,而且还需要需求不同节点的电流值, 从放大缩小来看, 首先想到的是 D3 在集合领导给的部分相关资料 综上: 进行了可行性的方案试探,也完成了整个功能的开发. 且听我细细

  • 教你在vue项目中使用svg图标的方法

    svg图标优点 svg与iconfont之类的字体图标在网页中的使用差别不大,可以修改大小,颜色等而且不失真. 安装svg-sprite-loader npm install --save-dev svg-sprite-loader 文件夹目录 (xxx.svg 注意:这里的 xxx 不要使用中文) - assets -- icon --- svg --- index.js 配置依赖 // Vue2.x 在 webpack.base.conf.js 中配置如下: // 注意svg图标的路径 sr

  • vue项目引入svg图标的完整步骤

    目录 1. 安装svg依赖 2. 创建svg文件夹存放svg图标 3. vue.config.js 中配置svg图片 4. 创建index.js 导入所有svg图标 5. main.js中引入icons/index.js 6. 创建SvgIcon公用组件 总结 1. 安装svg依赖 在vue中首先需要安装可以加载svg的依赖. npm安装:npm install svg-sprite-loader --save-dev 2. 创建svg文件夹存放svg图标 创建icons文件夹,在icons文件

  • vue项目中自动导入svg并愉快的使用方式

    目录 引入图标的几种方式 远古时代 iconfont时代 svg时代 处理loader,对指定目录svg文件处理 安装loader 配置vue.config.js 接下来使用vue inspect看下目前的配置 编写一个自定义组件 编写一个js,实现svg自动化 至此就可以愉快的使用svg了 压缩优化 引入图标的几种方式 远古时代 一个个小图标png图片引入,代码中在一个个引用 spirit图片,将多个图标放在一张png图片上,通过background属性显示对应的图标 iconfont时代 将

  • 在vue项目中优雅的使用SVG的方法实例详解

    1.基础介绍 本文旨在介绍如何在项目中配置和方便的使用svg图标. 本文以vue项目为例,当然在react中的使用原理基本相似. svg图标可以直接通过img标签来使用,也可当做icon来使用. 本文是参考了鑫旭大佬的文章:SVG Sprite技术介绍. 2.配置 安装svg-sprite-loader.通过vue-cli脚手架创建的项目默认情况下会使用 url-loader 对svg进行处理,所以需要处理下: { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, l

  • vue项目中导入swiper插件的方法

    版本选择 swiper是个常用的插件,现在已经迭代到了第四代:swiper4. 常用的版本是swiper3和swiper4,我选择的是swiper3. 安装 安装swiper3的最新版本3.4.2: npm i swiper@3.4.2 -S 这里一个小知识,查看node包的所有版本号的方法: npm view 包名 versions 组件编写 swiper官方的使用方法分为4个流程: 加载插件 HTML内容 给Swiper定义一个大小 初始化Swiper 我也按照这个流程编写组件: 加载插件

  • vue项目中使用Svg的方法

    github demo: github地址 闲聊背景 本文主要以 vue-cli3 搭建的项目为例,来聊一下如何在项目中更优雅的使用 svg . 众所周知, vue-cli3 已经推出很长一段时间了,大家可以感受一下 vue-cli3 带来的零配置体验.But,也相应带来了一些弊端,就是如归需要修改默认的 loader 时,会比较麻烦. 们接下来主要使用的就是上文中提到的 svg 的 use ,先上一张 vue-cli3 搭建的项目的目录,可以看到根目录下只保留了 public/ 以及 src/

  • Vue项目中使用better-scroll实现一个轮播图自动播放功能

    前言 better-scroll是一个非常非常强大的第三方库 在移动端利用这个库 不仅可以实现一个非常类似原生ScrollView的效果 也可以实现一个轮播图的效果 这里就先记录一下自己实现这个效果的一些过程吧 思路 1.首先要确定自己的HTML结构 基本结构就是一个wrapper包含一个content 2.其次需要明白的一个页面可以滚动的原理在于 当内容的高度超出了容器的高度才可以实现滚动 如果没有超出 那么就没有滚动的必要 因此第一点需要实现的就是 获取到所有内容的高度 由于实现的是一个轮播

  • vue项目中进行svg组件封装及配置方法步骤

    最近刚入新的公司,拿到项目之后,发现一个有趣的事情就是标题的icon是用svg来弄的,这篇文章彻底弄清楚怎么使用 1.创建vue项目(通过cli来搭建脚手架,该测试项目是用vue cli4进行配置的) 2.创建一个自定义组件 具体代码如下: <template> <svg :class="svgClass" aria-hidden="true" v-on="$listeners"> <use :xlink:href=

  • vue项目中封装echarts的优雅方式分享

    目录 场景 需求 代码总览 实现 components--chart--index.vue components--chart--index.js components--chart--options main.js chartTest index.vue index.js 代码 总结 补充 补充2:图表高亮轮询,dispatchAction使用 使用方法 附:echarts 饼图调用高亮示例 dispatchAction 补充3:封装echarts地图,姐妹篇 总结 场景 1.Echarts使

  • 在vue项目中安装使用Mint-UI的方法

    一.Mint UI 是 由饿了么前端团队推出的 一个基于 Vue.js 的移动端组件库,具有以下特性: 使用文档: http://mint-ui.github.io/#!/zh-cn Mint UI 包含丰富的 CSS 和 JS 组件,能够满足日常的移动端开发需要.通过它,可以快速构建出风格统一的页面,提升开发效率. 真正意义上的按需加载组件.可以只加载声明过的组件及其样式文件,无需再纠结文件体积过大. 考虑到移动端的性能门槛,Mint UI 采用 CSS3 处理各种动效,避免浏览器进行不必要的

  • vue项目中使用scss的方法步骤

    一 概述 随着sass/less等css预处理器的出现,编写css变的越来越有乐趣.所以现在越来越多的人在项目中喜欢使用scss或者less.(我自己就是一个).由于最近在写一个vue项目.所以就把写项目期间每天的一些知识点写在博客里.所以最近的博客应该都会和vue有关.今天要和大家分享的就是如何在vue项目中引入scss(引入less也类似) 二 vue中引入scss 2.1 vue-loader 在讲如何在vue项目中使用scss之前,我们先来简单了解一个概念,那就是vue-loader.v

随机推荐