使用 svg-sprite-loader 批量引入 icon

简介: 使用 svg-sprite-loader 批量引入 icon

1、推荐阿里 iconfont

前端在做项目的过程中,都会频繁使用图标,记得几年前还是流行使用 CSS Sprite 雪碧图,它的好处有减少 HTTP 请求数,提高性能,节省一些流量等等,但是使用 CSS Sprite 雪碧图的方式也有一些缺点,比如图片拼接合成麻烦且耗时,后期如果需要追加小图标,则大的雪碧图维护起来比较繁琐,最好只是往下加图片,而不要更改已有图片,而且对每个需要记录每个图标的精确位置,这就会给设计师和开发人员带来不少的麻烦。


最近几年前端比较流行的是使用 iconfont 图标 symbol 引用方式,这里推荐阿里的 iconfont 矢量图标库,iconfont 有多种引入方式,其中主流的是 svg(本质就是一串xml),它的好处有很多,比如:支持多色图标了,不再受单色限制。支持像字体那样通过 font-size,color 来调整样式。矢量,缩放不失真,而且满足减少HTTP请求次数的需求。

2、使用前的一些配置

第一步:将 svg 格式的图标导入项目中,可以通过 `import svg from '@/assets/icons/home.svg'` 的方式引入,如果你的项目是 TypeScript 开发的话,在你写上面这条语句时会报错,StackOverflow 查一下,需要在 shims-vue.d.ts 文件追加声明:

declare module "*.svg" {  //防止import svg时报错
  const content: string;
  export default content;
}

如果这个时候,在 import 语句后打印 svg 会打印出一个 .svg 的文件路径,这并不是我们所需要的,还需额外的配置才行。


第二步:我们还需要使用一个 svg-sprite-loader 的东西,来加载一下 svg 图标。根据文档 安装 svg-sprite-loader 后,文档上说了需要在 webpack.config.js 文件中配置以下,但是问题是我们使用 Vue CLI 创建的项目没有这个文件,只有 vue.config.js,所以要将 webpack 的配置翻译过来,写在 vue.config.js 文件中。

const path = require('path');  //使用require报错:可改.eslintrc.js配置、可改成import、可写 eslint ignore注释
module.exports = {
  publicPath: process.env.NODE_ENV === 'production'
      ? '/charge-website/'
      : '/',
  lintOnSave: false,
  chainWebpack: config =>{
    const dir = path.resolve(__dirname, 'src/assets/icons') //svg图标的路径
    config.module //vue将webpack封装后暴露出来的config接口
        .rule('svg-sprite') //添加规则
        .test(/\.svg$/)  //匹配.svg为结尾的文件
        .include.add(dir).end() // 只包含 icons 目录的路径
        .use('svg-sprite-loader').loader('svg-sprite-loader').options({extract:false}).end()  //不需要解析成文件
        //.use('svgo-loader').loader('svgo-loader')  //删除svg中的fill填充色、npm install --dev svgo-loader一下
        //.tap(options => ({...options, plugins: [{removeAttrs: {attrs: 'fill'}}]}))  //删除svg中的fill填充色
    config.plugin('svg-sprite').use(require('svg-sprite-loader/plugin'), [{plainSprite: true}])
    config.module.rule('svg').exclude.add(dir) // 其他 svg loader 排除 icons 目录:loader 分功避免冲突
  }
}

这个时候在 import 语句后打印 svg 会打印出一个 <symbol> 标签,而且在 <body> 标签中会出现一个 <svg> 标签的东西,<svg> 内部包裹一些 <symbol> 标签,svg-sprite-loader 会给每个 <symbol> 标签都添加一个 id 属性。

3、svg 图标的引入和使用

通过上述配置,svg-sprite-loader 会把 import 引入的 svg 解析成对应的 symbol,将其插入到页面的 body 标签中的 <svg> 标签下,这时我们就可以使用 svg use 的方式对 svg 格式的图标进行使用,它就会出现在页面上了。

<!--html 部分可以直接引入-->
<svg>
    <use xlink:href="#labeL">
</svg>
<script lang="ts">
  //import svg from '@/assets/icons/home.svg'    //这样每个图标引入一次比较麻烦
  //直接引入/assets/icons目录下的所有svg图片,批量引入更加方便
  const importAll = (requireContext: __WebpackModuleApi.RequireContext) => requireContext.keys().forEach(requireContext);
  try {importAll(require.context('../assets/icons', true, /\.svg$/));} catch (error) {console.log(error);}
<script>

通过 symbol 引用方式,有的图标不能通过 color 修改颜色的解决办法,有的又可以。

<svg class="icon" aria-hidden="true" style="color:red;">
     <use xlink:href="#icon-PDF"></use>
</svg>

原因是,当从阿里图库中图标被添加至项目,如果编辑过项目图标的颜色或者图标本身是有颜色的,那么在通过symbol获取图标时会在 svg 的 path 中增加 fill 属性,导致无法更改颜色,如果需要动态修改颜色,需要从新添加该图标(本身图标无色),获取在 symbol 的 js 文件中程序删除 fill 属性。

目录
相关文章
<script setup>形式中props传值
<script setup>形式中props传值
203 1
|
12月前
|
存储 Kubernetes 持续交付
k8s学习
【10月更文挑战第1天】
432 4
|
8月前
|
缓存 前端开发 安全
网站显示不安全的解决办法
当浏览器提示网站“不安全”时,通常是HTTPS配置或证书问题。解决方法包括:检查网址、验证证书状态(是否失效、域名匹配、CA受信任),确保证书链完整,避免自签名证书;解决混合内容问题,确保所有资源使用HTTPS;修正服务器配置,强制HTTP跳转HTTPS,启用TLS 1.2/1.3,添加HSTS;检查本地时间与浏览器缓存。按此步骤排查,可有效解决问题。
|
应用服务中间件 nginx
配置nginx时加上--without-http_rewrite_module这个参数,就不需要安装pcre
不加--without-http_rewrite_module这个参数时就是启动URL重写,所以需要pcre ./configure --with-http_stub_status_module --without-http_rewrite_module --prefix=/usr/local/n...
3047 0
|
10月前
|
机器学习/深度学习 数据采集 搜索推荐
使用Python实现深度学习模型:智能食品消费行为预测
使用Python实现深度学习模型:智能食品消费行为预测
243 8
|
11月前
|
运维 负载均衡 Ubuntu
自动化运维的利器:Ansible入门与实践
【10月更文挑战第31天】在当今快速发展的信息技术时代,高效的运维管理成为企业稳定运行的关键。本文将引导读者了解自动化运维工具Ansible的基础概念、安装步骤、基本使用,以及如何通过实际案例掌握其核心功能,从而提升工作效率和系统稳定性。
|
网络协议 安全 网络安全
深入解析TURN协议的作用与重要性
【8月更文挑战第24天】
404 0
|
SQL 关系型数据库 MySQL
|
JavaScript
vue实现多个el-form表单提交统一校验的2个方法
vue实现多个el-form表单提交统一校验的2个方法
893 0
|
SQL 存储 关系型数据库
SQL安装指南:一步步教你如何安装并配置SQL数据库
展望未来,随着技术的不断进步和应用场景的不断拓展,SQL数据库将继续发挥重要作用。同时,我们也需要不断学习和掌握新的数据库技术和工具,以适应不断变化的市场需求和技术挑战。希望本文能为你提供一个良好的起点,帮助你在SQL数据库的学习和实践之路上取得更大的进步。