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 相关文章推荐
JavaScript下申明对象的几种方法小结
Oct 02 Javascript
js确定对象类型方法
Mar 30 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
Nov 20 Javascript
jQuery 中国省市两级联动选择附图
May 14 Javascript
js和jquery中循环的退出和继续下一个循环
Sep 03 Javascript
JavaScript html5 canvas绘制时钟效果
Mar 01 Javascript
原生JS实现图片轮播效果
Dec 26 Javascript
微信小程序 弹幕功能简单实例
Feb 14 Javascript
javascript中神奇的 Date对象小结
Oct 12 Javascript
微信小程序仿美团城市选择
Jun 06 Javascript
小程序hover-class点击态效果实现
Feb 26 Javascript
Node.js实现一个HTTP服务器的方法示例
May 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
php利用iframe实现无刷新文件上传功能的代码
2011/09/29 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
2014/08/22 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
2011/12/31 Javascript
JS 有趣的eval优化输入验证实例代码
2013/09/22 Javascript
JS获取地址栏参数的几种方法小结
2014/02/28 Javascript
JavaScript常用小技巧小结
2014/12/29 Javascript
php基于redis处理session的方法
2016/03/14 Javascript
EasyUI中的dataGrid的行内编辑
2017/06/22 Javascript
Vue导出json数据到Excel电子表格的示例
2017/12/04 Javascript
vue cli使用融云实现聊天功能的实例代码
2019/04/19 Javascript
JS实现拖动模糊框特效
2020/08/25 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
2020/10/30 Javascript
python 正则式 概述及常用字符
2009/05/07 Python
Python类属性与实例属性用法分析
2015/05/09 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
2017/11/23 Python
创建pycharm的自定义python模板方法
2018/05/23 Python
python适合人工智能的理由和优势
2019/06/28 Python
详解django中Template语言
2020/02/22 Python
深入解析HTML5 Canvas控制图形矩阵变换的方法
2016/03/24 HTML / CSS
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
澳大利亚领先的在线美容商店:Facial Co
2017/10/22 全球购物
英国书籍、CD、DVD和游戏的第一道德零售商:Awesome Books
2020/02/22 全球购物
中式面点餐厅创业计划书
2014/01/29 职场文书
物理专业大学生职业生涯规划书
2014/02/07 职场文书
巡警年度自我鉴定
2014/02/21 职场文书
投标人廉洁自律承诺书
2014/05/26 职场文书
法人委托书
2014/07/31 职场文书
高校教师个人工作总结2014
2014/12/17 职场文书
2015年敬老月活动总结
2015/03/27 职场文书
农村结婚典礼主持词
2015/06/29 职场文书
Golang 获取文件md5校验的方法以及效率对比
2021/05/08 Golang
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python
Golang并发工具Singleflight
2022/05/06 Golang
Python中的协程(Coroutine)操作模块(greenlet、gevent)
2022/05/30 Python
SQL语句中EXISTS的详细用法大全
2022/06/25 MySQL