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在IE和FF下的兼容性问题
May 19 Javascript
jquery实现多屏多图焦点图切换特效的方法
May 04 Javascript
jQuery的extend方法【三种】
Dec 14 Javascript
ES6新数据结构Set与WeakSet用法分析
Mar 31 Javascript
Node.js操作redis实现添加查询功能
May 25 Javascript
JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析
Jul 31 Javascript
JavaScript实现构造json数组的方法分析
Aug 17 Javascript
JavaScript中创建原子的方法总结
Aug 26 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
Oct 16 Javascript
node.js爬取中关村的在线电瓶车信息
Nov 13 Javascript
jQuery实现的导航条点击后高亮显示功能示例
Mar 04 jQuery
vue 在methods中调用mounted的实现操作
Aug 07 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自动适应范围的分页代码
2008/08/05 PHP
php 连接mssql数据库 初学php笔记
2010/03/01 PHP
php 无法载入mysql扩展
2010/03/12 PHP
PHP中用接口、抽象类、普通基类实现“面向接口编程”与“耦合方法”简述
2011/03/23 PHP
php可变长参数处理函数详解
2017/02/22 PHP
用JTrackBar实现的模拟苹果风格的滚动条
2007/08/06 Javascript
extjs 列表框(multiselect)的动态添加列表项的方法
2009/07/31 Javascript
js几秒以后倒计时跳转示例
2013/12/26 Javascript
实例分析javascript中的call()和apply()方法
2014/11/28 Javascript
javascript禁止超链接跳转的方法
2016/02/02 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
使用jQuery处理AJAX请求的基础学习教程
2016/05/10 Javascript
三种带箭头提示框总结实例
2016/06/14 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
React如何避免重渲染
2018/04/10 Javascript
JS中call()和apply()的功能及用法实例分析
2019/06/28 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
Vue路由的模块自动化与统一加载实现
2020/06/05 Javascript
[51:34]Ti4主赛事胜者组 DK vs EG 2
2014/07/19 DOTA
[00:55]深扒TI7聊天轮盘语音出处3
2017/05/11 DOTA
python字符串替换示例
2014/04/24 Python
Windows下Python3.6安装第三方模块的方法
2018/11/22 Python
CSS中几个与换行有关的属性简明总结
2014/04/15 HTML / CSS
Keds官方网站:购买帆布运动鞋和经典皮鞋
2016/11/12 全球购物
UNIX文件类型
2013/08/29 面试题
Ruby如何实现动态方法调用
2012/11/18 面试题
医学护理毕业生自荐信
2013/11/07 职场文书
致100米运动员广播稿
2014/02/14 职场文书
运动会广播稿100字
2014/09/14 职场文书
2014年民政工作总结
2014/11/26 职场文书
2015年网络管理员工作总结
2015/05/21 职场文书
vue引入Excel表格插件的方法
2021/04/28 Vue.js
纯html+css实现Element loading效果
2021/08/02 HTML / CSS
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python