共计 1975 个字符,预计需要花费 5 分钟才能阅读完成。
每次在项目中使用 icon 的图标时,总是觉得引入很长的路径很麻烦,或许需要将它们写成一个个伪元素。最近发现了 svg-sprite-loader 可以解决你的烦恼。
工作原理
svg-sprite-loader 实际上是把所有的 svg 打包成一张雪碧图,类似下图。每一个 symbol 装置对应的 icon,再通过 <use xlink:href=”#xxx”/> 来显示你所需的 icon。
symbolzhuan
1. 安装依赖及修改配置
1.1 npm i svg-sprite-loader1.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 组件