热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

这篇文章主要介绍了vue项目中自动导入svg并愉快的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完

vue项目中自动导入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]"
      }
    }
  ]
}

编写一个自定义组件

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

// install
npm i svgo-loader -D

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程笔记。


推荐阅读
  • 突破MIUI14限制,自定义胶囊图标、大图标样式,支持任意APP
    本文介绍了如何突破MIUI14的限制,实现自定义胶囊图标和大图标样式,并支持任意APP。需要一定的动手能力和主题设计师账号权限或者会主题pojie。详细步骤包括应用包名获取、素材制作和封包获取等。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
author-avatar
寄到家的_259
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有