最近重新学习了一遍 React 基础,新起了个小 Demo 实践一下,项目中用到的静态资源也比较少,图标当时使用的是 svg symbols 的方式引入(字体图标三种格式区别),但是在开发的过程中遇到几个问题:

  • ① 下载的 svg 可能有自带的 fill 属性,添加 color 样式不生效。
  • ② 封装 Icon 组件时,每用到一个 svg 图标都需要引入一下,显得有点不太聪明。

为解决上述两个问题,上网找了一下解决方案,在这里总结一下,每天成长一点点。

1、svg 的基本使用

SVG :可缩放矢量图形(Scalable Vector Graphics),使用 XML 格式定义图像。使用起来其实也没什么不一样的地方,可以直接将下载好的 svg 图片导入,然后像这样使用:

import apple from "../assets/icons/apple.svg"  // 得到一个计算之后的路径const Icon = (props) => {return (<img src={apple} />);
};export default Icon;

这样使用可能会导致上面所说的问题 ,虽然可以手动把 svg 图片中的 fill 属性给删掉,但是如果 svg 很多的话手动处理起来就会很耗时,我们可以通过更聪明的办法:自定义 loader 来解决这个问题,如下。

2、svg-sprite-loader

svg-sprite-loader 的官方解释是:一个用于创建 svg 雪碧图的 Webpack 加载器。这个加载器现在已经被 JetBrains 公司收录和维护了。通俗的讲:svg-sprite-loader 会把你引入的 svg 塞到一个个 symbol 中,合成一个大的 svg,最后将这个大的 svg 放入 body 中。symbol 的 id 如果不特别指定,就是你的文件名。在页面上形成这样的元素:

<body><svg xmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"style="position: absolute; width: 0; height: 0" aria-hidden="true" id="__SVG_SPRITE_NODE__"><symbol xmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"class="icon" viewBox="0 0 1024 1024"id="label"><defs><style type="text/css"></style></defs><!-- path ... (path 中可能含有 fill 属性,也就是 svg 的自带颜色) --></symbol><!-- other symbols--></svg>
</body>

通常情况下,我们用脚手架初始化的项目是没有办法自定义 loader 的,那怎么办呢?我们就需要执行如下命令手动的项目的 webpack.config.js 文件搞出来(这个操作是不可逆的)。

npm run eject
// or
yarn eject

执行会出现提示:Are you sure you want to eject? This action is permanent.(y/N)。直接就可以了。配置完成之后我们需要对 svg loader 进行相关配置,在 webpack.config.js 的 module.rules  的 oneOf 中添加:

// 配置之前需要安装该 loader
// npm install --dev svg-sprite-loader
// yarn add --dev svg-sprite-loader{test: /\.svg$/,use: [{ loader: 'svg-sprite-loader', options: {} }]
}

完成上述配置之后,我们就可以通过指定 id 的方式使用 use 的方式使用 svg 了,如下:

// 下面这种方式有坑,最终会被 Tree Shaking
// import apple from "../assets/icons/apple.svg"  // 得到一个计算之后的路径
require('../assets/icons/apple.svg')const Icon = (props) => {return (<svg fill="red"><use xlink:href="#apple"/></svg>);
};export default Icon;

而且经过 svg-sprite-loader 加载之后,不仅可以通过指定 id 的方式引入 icon,而且相比图片引入的方式,最大的优点就在于可以通过给 svg 标签添加 fill 属性来调整 icon 的颜色。

除此之外,还可以通过给 svg 添加 class 来调整 icon 的样式,虽然说图片引入的方式也能做到,但是如果图片指定宽高与原图的宽高不成比例,就会导致图片的失真,而 svg 不会。即使随意调整 svg 的宽高样式,它也是按照原尺寸进行缩放,达到高保真的效果。

使用 svg-sprite-loader、svgo-loader 优化 svg symbols相关推荐

  1. vue svg sprite loader_Vue项最佳实践

    资源 Vue-CLI 3.0:https://cli.vuejs.org/zh/guide/webpack.html vue-element-admin:https://github.com/PanJ ...

  2. 50兆 svg 文件超过_使用 SVGO 来减小 SVG 文件大小的三种方法

    在这篇文章中我将建议你三种方法,利用 SVGO 让你对 SVG 进行优化,使之适合 Web 使用. 为什么你需要对 SVG 做优化 SVG (全称是 Scalable Vector Graphics) ...

  3. 未来必热:SVG Sprite技术介绍(转自张鑫旭-鑫空间-鑫生活)

    一.Sprite技术 这里所说的Sprite技术,没错,类似于CSS中的Sprite技术.图标图形整合在一起,实际呈现的时候准确显示特定图标. 另,本文图片甚多,爪机党继续浏览需慎重. 二.SVG S ...

  4. REM+SVG Sprite,web app案例

    REM+SVG Sprite,构建新时代web app <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN&quo ...

  5. SVG Sprite技术介绍

    一.Sprite技术 这里所说的Sprite技术,没错,类似于CSS中的Sprite技术.图标图形整合在一起,实际呈现的时候准确显示特定图标. 另,本文图片甚多,爪机党继续浏览需慎重. 二.SVG S ...

  6. SVG Sprite 使用简介

    SVG简介 SVG即可缩放矢量图形 (Scalable Vector Graphics)的简称, 是一种用来描述二维矢量图形的XML标记语言. SVG图形不依赖于分辨率, 因此图形不会因为放大而显示出 ...

  7. img 加载 svg占位符_如何使用SVG作为占位符以及其他图像加载技术

    img 加载 svg占位符 by José M. Pérez 由JoséM.Pérez 如何使用SVG作为占位符以及其他图像加载技术 (How to use SVG as a Placeholder, ...

  8. vue 不识别svg_vue中引用svg,vue引入svg不显示,vue引用svg配置,vue3.0+ts如何配置svg...

    注意: 如果按照下面配置正确发现svg依然无法显示可能s'v'g-sprite-loader的版本过高,重新指定版本下载npm i svg-sprite-loader@3.8.0 --save-dev ...

  9. 苹果系统使用svg 动画_为什么要使用SVG图像:如何为SVG设置动画并使其快速闪电化

    苹果系统使用svg 动画 我们为什么要使用SVG? (Why Are We Using SVG?) The web development sector is growing at a rapid p ...

  10. 解决:Svg图标,vue中使用 .svg 文件

    解决:颜色不能切换 1.使用插件 npm i svg-sprite-loader 2.webpack.base.conf.js 文件中配置 module: {rules: [{test: /\.svg ...

最新文章

  1. Oracle数据库表设计时的注意事项
  2. 算法-二叉树中的最大路径和
  3. [翻译练习] #selector() 和响应者链
  4. java并发编程之美-阅读记录5
  5. 生生世世 —— schedule 的轮回(七)
  6. 【STM32】关闭JTAG接口,引脚设置推挽输出
  7. TPLinker 实体关系抽取代码解读
  8. 常用运放做跟随器使用总结
  9. vector实现 并交差 集实例
  10. python - 乌龟吃鱼游戏
  11. Java中使用isAlphabetic()办法无法解决判断一个char是英文字母,该用别的方法解决
  12. Android手表商场项目总结
  13. “朝抵抗力最大的路径上走”
  14. mybatis 练习二(vue)
  15. php pecl libevent,ubuntu – 安装PHP libevent PECL包的问题
  16. AR互动大屏丨Add_自动循环动画、遮挡效果的实现
  17. 2021年开源愿景大揭秘
  18. 网站SEO优化多少钱 网站seo优化费用多少
  19. K8s安装dashboard可视化界面
  20. yyyy-MM-dd‘T‘HH:mm:ss - 里面的‘T‘是什么意思

热门文章

  1. 带nfc 的 android 华为,华为手机NFC功能,原来这么好用,不会用真可惜几千块钱了...
  2. hdu 1430 魔板
  3. matlab 反复激活 许可证到期 解决方法
  4. 基于景观智慧路灯的智慧景区系统集成解决方案
  5. 论文翻译:DeepFaceLab:一个简单,灵活的可扩展换脸框架
  6. 抓取spotify歌单_如何使用python抓取Spotify上最受欢迎的歌曲
  7. 数据库与身份认证——黑马课程笔记
  8. 经典相关分析,典型关分析, CCA,Canonical Correlation Analysis,多元变量分析,线性组合,相关系数最大化...
  9. 时域频域的四种傅里叶变换
  10. 遥感理论基础——电磁波(一)