nuxtjs使用SVG 图标
2020-12-29 本文已影响0人
莫伊剑客
svg图片目录
一、安装依赖
npm i svg-sprite-loader -D
二、修改规则和新增规则,nuxt.config.js
// resolve定义一个绝对路径获取函数
const path = require('path')
function resolve (dir) { return path.join(__dirname, dir) }
build: {
/*
** You can extend webpack config here
*/
extend (config, ctx) {
// 排除 nuxt 原配置的影响,Nuxt 默认有vue-loader,会处理svg,img等
// 找到匹配.svg的规则,然后将存放svg文件的目录排除
const svgRule = config.module.rules.find(rule => rule.test.test('.svg'))
svgRule.exclude = [resolve( 'assets/icons/svg')]
//添加loader规则
config.module.rules.push({
test: /\.svg$/, //匹配.svg
include: [resolve('assets/icons/svg')], //将存放svg的目录加入到loader处理目录
use: [{ loader: 'svg-sprite-loader', options: { symbolId: 'icon-[name]' } }]
})
}
}
###三、组件化
<template>
<svg :class="svgClass" v-on="$listeners">
<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 lang="scss" scoped>
.svg-icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill:currentColor;
overflow: hidden;
}
</style>
四、插件注册
// plugins/svgIcon.js
import Vue from 'vue'
import SvgIcon from '@/components/svgIcon'// Nuxt 默认@指向根目录
// 注册组件
Vue.component('svg-icon', SvgIcon)
//预请求svg组件(通过之前的svg-sprite-loader加载)
const req = require.context('@/assets/icons/svg', false, /\.svg$/)
req.keys().map(req);
五、配置文件挂载
// 配置文件挂载
plugins: [
'@/plugins/svgIcon',
],