vue使用icon图标:svg-sprite-loader
每次在项目中使用icon的图标时,总是觉得引入很长的路径很麻烦,或许需要将它们写成一个个伪元素。最近发现了svg-sprite-loader可以解决你的烦恼。
工作原理
svg-sprite-loader实际上是把所有的svg打包成一张雪碧图,类似下图。每一个symbol装置对应的icon,
再通过<use xlink:href="#xxx"/>来显示你所需的icon。
symbolzhuan
1.安装依赖及修改配置
1.1 npm i svg-sprite-loader
1.2 在bulid/webpack.base.conf.js配置文件中增加一条rules
{ test: /\.svg$/, loader: 'svg-sprite-loader', include: [resolve('src/icons')], options: { symbolId: 'icon-[name]' } }
注意在vue-cli构建的项目中会默认有一条包含有svg格式的图片转成base64的rules,所以需要再稍作修改
修改前,如果同时使用这两条规则会使项目启动失败。 { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: utils.assetsPath('img/[name].[hash:7].[ext]') } }
如果一个项目中有需要.svg用作图片也有用作icon的可以这样修改
用作图片的
{ test: /\.svg$/, loader: 'url-loader', outputPath: path.resolve(__dirname, ./assets/images/svg)//存放icon的路径 }
用作icon的.
include:存放icon的路径
{ test: /\.svg$/, loader: 'svg-sprite-loader', include: [resolve('src/icons')], options: { symbolId: 'icon-[name]' } }
2.在components/svgIcon 创建组件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>
3.保存svg图片和全局注册svgIcon
3.1 icons/svg 用来保存图片
3.2 index.js 动态引入svg。作用在于虽然全局组册了svg但是在当前组件调用某个svg还是需要import这个文件,
我们可以通过webpack的context.require()来解决这个问题
require.context('./svg', false, /.svg$/),第一个参数是引入文件所在的文件夹,第二个是否引入子文件夹,第三个是匹配规则,
通过这个方法就可以动态的引入svg文件了。
.keys()返回svg数组
.map()再获取和上下文匹配的svg文件
import Vue from 'vue' import SvgIcon from '@/components/SvgIcon' // svg组件 // register globally Vue.component('svg-icon', SvgIcon) const requireAll = requireContext => requireContext.keys().map(requireContext) // (requireContext) => { // requireContext.keys().map(requireContext) // } // require const req = require.context('./svg', false, /\.svg$/) requireAll(req)
4.在入口文件引入 @/icons
5.引用组件
<svg-icon icon-class="name"/>
name为svg文件名
阅读这篇文章后再试着写demo,可以让你的理解更加透彻
懒人神器:svg-sprite-loader实现自己的Icon组件