nuxt中引入svg


1、安裝:

npm install svg-sprite-loader -D

2.svg-sprite-loader加載,nuxt.config.js配置如下

官方文檔使用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 看注釋吧

build: {
    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(__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 {
  width: 1em;
  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

 
    //增加 plugins 配置
    //nuxt 會在vue.js程序運行前,執行所有注冊的插件
    plugins:{
        '@/plugins/svg-icon' //注冊svg插件文件 
    },

5.頁面中使用

下載SVG圖標到 assets/icons/svg/blog.svg 然后在vue 模板中使用

        <!-- icon-class 的值,即svg文件名  -->
         <div style="font-size:16px;color:green;">
           <svg-icon icon-class="test" />
         </div>

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM