VUE-cli3使用 svg-sprite-loader


Posted in Javascript onOctober 20, 2018

VUE-cli3使用 svg-sprite-loader

svg-sprite-loader 的插件,用来根据导入的 svg 文件自动生成 symbol 标签并插入 html,接下来就可以在模版中方便地使用 svg-sprite 技术了。

使用 svg-sprite 的好处

  • 页面代码清爽
  • 可使用 ID 随处重复调用
  • 每个 SVG 图标都可以更改大小颜色

安装插件

npm install svg-sprite-loader --save-dev

webpack 配置,在Vue.config.js加入处理 svg 的 loader:

const path = require('path')
function resolve(dir) {
 return path.join(__dirname, '.', dir)
}
module.exports = {
 chainWebpack: config => {
  config.module.rules.delete("svg"); //重点:删除默认配置中处理svg,
  //const svgRule = config.module.rule('svg')
  //svgRule.uses.clear()
  config.module
   .rule('svg-sprite-loader')
   .test(/\.svg$/)
   .include
   .add(resolve('src/icons')) //处理svg目录
   .end()
   .use('svg-sprite-loader')
   .loader('svg-sprite-loader')
   .options({
    symbolId: 'icon-[name]'
   })
 },
 configureWebpack: () => ({
  // resolve: {
  //  alias: require('./alias.config').webpack
  // }
  // module: {
  //  rules: [{
  //   test: /\.svg$/,
  //   use: [{
  //    loader: "svg-sprite-loader",
  //    options: {
  //     symbolId: 'icon-[name]'
  //    }
  //   }]
  //  }]
  // }
 })
}

这时候发现还是不行啊, body 中并没有看到 symbol 标签。

VUE-cli3使用 svg-sprite-loader

就是说只有我们自己引入的 svg 文件需要经过 svg-sprite-loader,那么就将这些 svg 统一放到一个目录下,我这里放到了 src/icons

然后要在用到的地方引入需要的svg

import './src/icon/target.svg';

重新启动项目,终于在 html 中看到了 symbol 标签!

配置好了,就可以用了。使用方法很简单,相较于原来插入 svg 图标的方法(img src 或将 svg 整个写入 html),用 svg-sprite 更加简单且清爽:

<svg><use xlink:href="#target" /></svg>

嗯,就这样短短一行。 xlink:href 中传入 svg ID 就好了,由于在上面的配置文件中我们直接使用文件名作为 symbol 的 ID,所以这里传入的 ID 即为你想显示的图标的 svg 文件名,记得加上 # 。

自动导入

你会发现,这里要想插入某个图标,都得 import ,每用一个都要重复一遍这个流程,太麻烦,那么我们就让 src/icons/svg/下的 svg 文件都自动导入吧。

webpack 可以帮我们做到:

// requires and returns all modules that match
const requireAll = requireContext => requireContext.keys().map(requireContext);
// import all svg
const req = require.context('./assets/svg', true, /\.svg$/);
requireAll(req);

代码实例:

VUE-cli3使用 svg-sprite-loader

首先在main.ts中引入import './icons/index',

icons/index.js,将icons/svg中的所有svg导入并注册全局组件SvgIcon

VUE-cli3使用 svg-sprite-loader

//SvgIcon组件代码

<template>
 <svg :class="svgClass" aria-hidden="true">
  <use :xlink:href="iconName"/>
 </svg>
</template>

<script>
export default {
 name: 'SvgIcon',
 props: {
  iconClass: {
   type: String,
   required: true
  },
  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>

接下来就可以使用组建了

VUE-cli3使用 svg-sprite-loader

关于 require.context 的详细用法,可以参考 webpack 文档:dynamic requires

这样一来,每当我们修改或增加新的 svg,只要将文件往这个目录下一扔,插件就会自动帮我们生成相应的 symbol 标签啦,接下来就只管用吧

Javascript 相关文章推荐
自动设置iframe大小的jQuery代码
Sep 11 Javascript
用jquery等比例控制图片宽高的具体实现
Jan 28 Javascript
jquery默认校验规则整理
Mar 24 Javascript
jQuery满屏焦点图左右滚动特效代码分享
Sep 07 Javascript
jQuery实现的指纹扫描效果实例(附演示与demo源码下载)
Jan 26 Javascript
ES6中非常实用的新特性介绍
Mar 10 Javascript
JavaScript定义数组的三种方法(new Array(),new Array('x','y')
Oct 04 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
Nov 10 Javascript
浅谈javascript中的数据类型转换
Dec 27 Javascript
微信小程序 实现动态显示和隐藏某个控件
Apr 27 Javascript
解决使用vue.js路由后失效的问题
Mar 17 Javascript
解决vue项目,npm run build后,报路径错的问题
Aug 13 Javascript
vuex2中使用mapGetters/mapActions报错的解决方法
Oct 20 #Javascript
Vue项目pdf(base64)转图片遇到的问题及解决方法
Oct 19 #Javascript
使用pkg打包Node.js应用的方法步骤
Oct 19 #Javascript
简化版的vue-router实现思路详解
Oct 19 #Javascript
vue中el-upload上传图片到七牛的示例代码
Oct 19 #Javascript
浅析vue-router原理
Oct 19 #Javascript
vue-cli3.0 脚手架搭建项目的过程详解
Oct 19 #Javascript
You might like
mysql5详细安装教程
2007/01/15 PHP
Fedora下安装php Redis扩展笔记
2014/09/03 PHP
PHP正则替换函数preg_replace和preg_replace_callback使用总结
2014/09/22 PHP
PHP自定义多进制的方法
2016/11/03 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
JavaScript中将一个值转换为字符串的方法分析[译]
2012/09/21 Javascript
jquery表单验证插件(jquery.validate.js)的3种使用方式
2015/03/28 Javascript
一篇文章掌握RequireJS常用知识
2016/01/26 Javascript
Node.js 文件夹目录结构创建实例代码
2016/07/08 Javascript
JS控制FileUpload的上传文件类型实例代码
2016/10/07 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
vue2.0 实现导航守卫的具体用法(路由守卫)
2018/05/17 Javascript
详解nvm管理多版本node踩坑
2019/07/26 Javascript
pygame学习笔记(4):声音控制
2015/04/15 Python
Python中str.format()详解
2017/03/12 Python
对python中的logger模块全面讲解
2018/04/28 Python
Python使用sax模块解析XML文件示例
2019/04/04 Python
基于python 将列表作为参数传入函数时的测试与理解
2020/06/05 Python
浅析Python 简单工厂模式和工厂方法模式的优缺点
2020/07/13 Python
Python基于Faker假数据构造库
2020/11/30 Python
美味咖啡的顶级烘焙师:Cafe Britt
2018/03/15 全球购物
面试求职的个人自我评价
2013/11/16 职场文书
房屋鉴定委托书范本
2014/09/23 职场文书
会计岗位职责
2015/02/03 职场文书
教学副校长工作总结
2015/08/13 职场文书
原来实习报告是这样写的呀!
2019/07/03 职场文书
Python基础之元类详解
2021/04/29 Python
解决golang post文件时Content-Type出现的问题
2021/05/02 Golang
只需要这一行代码就能让python计算速度提高十倍
2021/05/24 Python
拒绝盗图!教你怎么用python给图片加水印
2021/06/04 Python
Java中的随机数Random
2022/03/17 Java/Android
高并发下Redis如何保持数据一致性(避免读后写)
2022/03/18 Redis
方法汇总:Python 安装第三方库常用
2022/04/26 Python
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle