1.安装svg-sprite-loader
1
| npm install svg-sprite-loader -D
|
2.配置文件nuxt.config.js添加loader
官方文档使用webpack进行配置 Nuxt extend
assets/icons/svg 目录是我存放svg文件的目录
PS: 默认情况下 Nuxt 使用 vue-loader、file-loader 以及 url-loader 这几个 Webpack 加载器来处理文件的加载和引用。
对于不需要通过 Webpack 处理的静态资源文件,可以放置在 static 目录中。
所以需要排除其他加载器对SVG文件的处理 参考GitHub Issue Nuxtjs + Vue-svg-loader
nuxt.config.js 配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| const { resolve } = require('path') export default { //something others build:{ extend(config,context){ // 排除 nuxt 原配置的影响,Nuxt 默认有vue-loader,会处理svg,img等 // 找到匹配.svg的规则,然后将存放svg文件的目录排除 const svgRule = config.module.rules.find(rule => rule.test.test('.svg')) svgRule.exclude = [resolve(__dirname, 'assets/icons/svg')]
//添加loader规则 config.module.rules.push({ test: /\.svg$/, //匹配.svg include: [resolve(__dirname, 'assets/icons/svg')], //将存放svg的目录加入到loader处理目录 use: [{ loader: 'svg-sprite-loader',options: {symbolId: 'icon-[name]'}}] } } } }
|
3.创建SvgIcon.vue组件,包装SVG便于引用
创建 components/SvgIcon/index.vue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| <template> <div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" /> <svg v-else :class="svgClass" aria-hidden="true" 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: { isExternal() { return /^(https?:|mailto:|tel:)/.test(this.iconClass) }, // 通过iconClass 获取svg文件名 iconName() { return `#icon-${this.iconClass}` }, svgClass() { if (this.className) { return 'svg-icon ' + this.className } else { return 'svg-icon' } }, // 返回url请求位置 styleExternalIcon() { return { mask: `url(${this.iconClass}) no-repeat 50% 50%`, '-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`, } }, }, } </script>
<style scoped> .svg-icon { min-width: 1em; min-height: 1em; fill: currentColor; overflow: hidden; }
.svg-external-icon { background-color: currentColor; mask-size: cover !important; display: inline-block; } </style>
|
4.增加插件(Nuxt plugin 使用 vue插件)加载SvgIcon.vue组件
Nuxt.js允许您在运行Vue.js应用程序之前执行js插件.
我们需要在程序运行前配置好这个插件。
创建 plugins/svg-icon.js
1 2 3 4 5 6 7 8 9
| 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$/) const requireAll = requireContext => requireContext.keys().map(requireContext) requireAll(req)
|
5.页面中使用
下载SVG图标到 asset/icons/svg/aaa.svg 然后在vue 模板中使用
1 2 3 4 5
| <template> <div class="NavGrid"> <svg-icon class="hhhh" icon-class="aaa" /> </div> </template>
|