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 相关文章推荐
用正则xmlHttp实现的偷(转)
Jan 22 Javascript
编写兼容IE和FireFox的脚本
May 18 Javascript
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
Oct 29 Javascript
javascript获取鼠标点击元素对象(示例代码)
Dec 20 Javascript
JQuery 使用attr方法实现下拉列表选中
Oct 13 Javascript
点评js异步加载的4种方式
Dec 22 Javascript
基于javascript实现页面加载loading效果
Sep 15 Javascript
原生js实现可爱糖果数字时间特效
Dec 30 Javascript
javascript正则表达式模糊匹配IP地址功能示例
Jan 06 Javascript
js编写简单的计时器功能
Jul 15 Javascript
利用jqprint插件打印页面内容的实现方法
Jan 09 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
Apr 09 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和MySQL保存和输出图片
2006/10/09 PHP
攻克CakePHP系列二 表单数据显示
2008/10/22 PHP
php GeoIP的使用教程
2011/03/09 PHP
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
PHP封装CURL扩展类实例
2015/07/28 PHP
php微信支付接口开发程序
2016/08/02 PHP
详解PHP中websocket的使用方法
2016/09/15 PHP
Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
2019/10/11 PHP
cnblogs中在闪存中屏蔽某人的实现代码
2010/11/14 Javascript
Extjs4 类的定义和扩展实例
2013/06/28 Javascript
window.print打印指定div实例代码
2013/12/13 Javascript
JQuery中操作Css样式的方法
2014/02/12 Javascript
JavaScript中使用ActiveXObject操作本地文件夹的方法
2014/03/28 Javascript
jQuery多级弹出菜单插件ZoneMenu
2014/12/18 Javascript
JS动态添加iframe的代码
2015/09/14 Javascript
JS中生成随机数的用法及相关函数
2016/01/09 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
在小程序中使用腾讯视频插件播放教程视频的方法
2018/07/10 Javascript
简单分析Python中用fork()函数生成的子进程
2015/05/04 Python
详解Python pygame安装过程笔记
2017/06/05 Python
详解Python中如何写控制台进度条的整理
2018/03/07 Python
将python文件打包成EXE应用程序的方法
2019/05/22 Python
Django 实现前端图片压缩功能的方法
2019/08/07 Python
使用python实现希尔、计数、基数基础排序的代码
2019/12/25 Python
Python logging模块写入中文出现乱码
2020/05/21 Python
tensorflow模型转ncnn的操作方式
2020/05/25 Python
pyCharm 实现关闭代码检查
2020/06/09 Python
英国的知名精品百货公司:House of Fraser(福来德)
2016/08/14 全球购物
出国签证在职证明
2014/01/16 职场文书
作弊检讨书1000字
2014/02/01 职场文书
个人整改方案范文
2014/10/25 职场文书
2014年第四季度入党积极分子思想汇报(十八届四中全会)
2014/11/03 职场文书
2015年暑假生活总结
2015/07/13 职场文书
2016年5月份红领巾广播稿
2015/12/21 职场文书
《祁黄羊》教学反思
2016/02/20 职场文书