1. 程式人生 > 實用技巧 >nuxt中引入svg

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>