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>


  • 2019-03-15 15:49:28

    win10远程桌面连接不上解决方法

    有朋友就感叹电脑的世界真的是很神奇,可以将整个世界连接在一起。如果别人想要摆弄你的电脑,即使不在一个地方也可以利用远程桌面来控制。而这就是所谓的远程控制操作了,大部分人都知道它的作用,不过这也不排除会遇到一些突发情况的时候,例如win10远程桌面连接不上,这该怎么去解决呢?为此,小编给大家带来了解决的图文操作。

  • 2019-03-15 16:49:18

    Win7无法进入家庭组提示“您的系统管理员不允许访问家庭组”怎么办

     家庭组是家庭网络上可以共享文件和打印机的一组计算机,可以方便用户们共享文件或者视频等,可是最近有win7纯净版系统用户却发现无法进入家庭组,提示“您的系统管理员不允许访问家庭组”,该怎么办呢?现在给大家分享一下Win7无法进入家庭组提示“您的系统管理员不允许访问家庭组”的解决方法。

  • 2019-03-17 22:19:28

    动态更新Toolbar Menu以及Menu中同时显示文字和图标

    我们经常会有这样的需求,在切换Fragment或者点击某个按钮后动态更新Toolbar上Menu项.但是onCreateOptionsMenu方法只在创建Activity的时候调用一次,以后就不再调用了,所以就不能在onCreateOptionsMenu中做处理了。 不过系统提供了另外的一个方法onPrepa

  • 2019-03-26 19:25:01

    Android studio 打包后安装闪退 Fatal Signal 6(SIGABRT)...

    项目上线前打包安装后闪退,查了很多原因,比如混淆文件的内容,第三方库不加入混淆等等,均未成功,后来关闭混淆打包后运行成功,原因可能是依赖工程中的库文件不能被混淆,关闭本工程混淆开关后,依赖工程的混淆开关也要关闭,关闭混淆后如果怕被反编译,可使用百度开发平台的app加固,加固的同时还能使用多渠道打包工具。

  • 2019-03-26 19:29:05

    Android NDK开发Crash错误定位

     在Android开发中,程序Crash分三种情况:未捕获的异常、ANR(Application Not Responding)和闪退(NDK引发错误)。其中未捕获的异常根据logcat打印的堆栈信息很容易定位错误。ANR错误也好查,Android规定,应用与用户进行交互时,如果5秒内没有响应用户的操作,则会引发ANR错误,并弹出一个系统提示框,让用户选择继续等待或立即关闭程序。并会在/data/anr目录下生成一个traces.txt文件,记录系统产生anr异常的堆栈和线程信息。如果是闪退,这问题比较难查, --------------------- 作者:xyang0917 来源:CSDN 原文:https://blog.csdn.net/xyang81/article/details/42319789 版权声明:本文为博主原创文章,转载请附上博文链接!

  • 2019-04-01 22:46:39

    电子签章的实施方案

    WORD/EXCEL签章模块,该部分实现与WORD/EXCEL的无缝结合,并提供给用户简单直观的菜单和工具条来实现文档签章验证等各种操作,其中,KHSC-64智能密码钥匙是签章模块中用户证书和图章的载体

  • 2019-04-01 22:48:25

    如何用 Java 对 PDF 文件进行电子签章

    印章是我国特有的历史文化产物,古代主要用作身份凭证和行驶职权的工具。它的起源是由于社会生活的实际需要。早在商周时代,印章就已经产生。如今的印章已成为一种独特的,融实用性和艺术性为一体的艺术瑰宝。传统的印章容易被坏人、小人私刻;从而新闻鲜有报道某某私刻公章,侵吞国家财产。随着计算机技术、加密技术及图像处理技术的发展,出现了电子签章。电子签章是电子签名的一种表现形式,利用图像处理技术、数字加密技术将电子签名操作转化为与纸质文件盖章操作相同的可视效果,同时利用电子签名技术保障电子信息的真实性和完整性以及签名人的不可否认性