Nuxt JS svg-sprite-loader 的使用和 自定义 VUE组件 来处理svg图标icon

2020-04-27 17:12:54

参考地址 Nuxt JS 使用 svg-sprite-loader 和 自定义 VUE组件 来处理svg图标icon

使用 svg-sprite-loader 和 自定义 VUE组件 来处理svg图标icon

1.安装svg-sprite-loader

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 看注释吧

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.vue

<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;
  vertical-align: -0.15em;
  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

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)

注册在nuxt.congfig.js中注册plugins/svg-icon.js插件 修改 nuxt.config.js

export default {
    //something others

    //增加 plugins 配置
    //nuxt 会在vue.js程序运行前,执行所有注册的插件
    plugins:{
        '@/plugins/svg-icon' //注册插件文件 
    },
    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]'}}]
        }
        }
    }
}

5.页面中使用

下载SVG图标到 asset/icons/svg/blog.svg 然后在vue 模板中使用

<template>
 <!-- icon-class 的值,即svg文件名  -->
 <svg-icon icon-class="blog" />
</template>


  • 2017-02-10 15:19:51

    Git:代码冲突常见解决方法

    如果系统中有一些配置文件在服务器上做了配置修改,然后后续开发又新添加一些配置项的时候, 在发布这个配置文件的时候,会发生代码冲突:

  • 2017-02-10 15:24:14

    linux学习之——vim简明教程

    学习 vim 并且其会成为你最后一个使用的文本编辑器。没有比这个更好的文本编辑器了,非常地难学,但是却不可思议地好用。 我建议下面这四个步骤: 存活 感觉良好 觉得更好,更强,更快 使用VIM的超能力

  • 2017-02-10 16:22:13

    git历史记录查询

    查看提交历史:git log 查看提交历史并显示版本间的差异:git log -p 查看指定历史:git log xxx(sha1值) -p 查看提交历史(指定时间):

  • 2017-02-13 17:50:05

    cURL error 60: SSL certificate problem: unable to get local issuer certificate

    Drupal 8 version uses Guzzle Http Client internally, but under the hood it may use cURL or PHP internals. If you installed PHP cURL on your PHP server it typically uses cURL and you may see an exception with error Peer certificate cannot be authenticated with known CA certificates or error code CURLE_SSL_CACERT (60).