vue-cli3使用svg的最佳實踐

目錄

  1. iconfont的三種使用方式及其優(yōu)缺點
  2. 封裝svg組件
  3. svg雪碧圖
  4. 自動導入svg圖標

封裝svg組件

代碼都是基于 vue 的實例(ps: react 也很簡單,原理都是類似的)

//components/Icon-svg
<template>
  <svg class="svg-icon" aria-hidden="true">
    <use :xlink:href="iconName"></use>
  </svg>
</template>

<script>
export default {
  name: 'icon-svg',
  props: {
    iconClass: {
      type: String,
      required: true
    }
  },
  computed: {
    iconName() {
      return `#icon-${this.iconClass}`
    }
  }
}
</script>

<style>
.svg-icon {
  width: 1em;
  height: 1em;
  vertical-align: -0.15em;
  fill: currentColor;
  overflow: hidden;
}
</style>

使用svg組件

//引入svg組件
import IconSvg from '@/components/IconSvg'

//全局注冊icon-svg
Vue.component('icon-svg', IconSvg)

//在代碼中使用
<icon-svg icon-class="password" />

svg雪碧圖

通過這篇文章 iconfont的三種使用方式及其優(yōu)缺點,我們已經(jīng)能在項目中使用svg圖標了,但是有一個麻煩是,eg:我們會在iconfont上面創(chuàng)建一個項目,然后把需要的圖標添加到項目里,接下來再生成文件,然后把文件保存下來。然而當我再去添加幾個圖標的時候,上面的動作我們需要重來一遍,這個太麻煩了,所以我們會用到svg-sprite(svg雪碧圖,跟以前的css-sprite類似)。具體操作如下:

  1. 在vue項目中配置svg-sprite-loader
    請參考文章vue-cli3中新添加svg-sprite-loader和file-loader
  2. 使用svg
    配置好以后,我們把svg文件都放到根目錄的icons下面,使用的時候,需要那個就加載那個,舉例:(這里的svg-icon是我們上面封裝的svg組件)
<template>
  <div id="app">
    <svg-icon iconClass="me"></svg-icon>
  </div>
</template>

<script>
import '@/icons/svg/me.svg'
export default {
  
}
</script>
  1. 我們在項目中使用了很多svg圖標,svg-sprite-loader能幫我們把這些圖標合成一張大的雪碧圖,就像這樣


自動導入所有圖標

經(jīng)過上面的一波操作,我們實現(xiàn)了按需加載,如果我們要添加圖標,直接往icons里放就好了,這個svg的圖標可以是你們ui制作的,也可以是從iconfont圖標庫download下來的。不過,這里還有兩個地方可以再優(yōu)化一下。

  1. 自動導入所有圖標
    首先我們創(chuàng)建一個專門放置圖標 icon 的文件夾如:@/src/icons,將所有 icon 放在這個文件夾下。 之后我們就要使用到 webpack 的 require.context。很多人對于 require.context可能比較陌生,直白的解釋就是
require.context("./test", false, /.test.js$/);
這行代碼就會去 test 文件夾(不包含子目錄)下面的找所有文件名以 .test.js 結(jié)尾的文件能被 require 的文件。
更直白的說就是 我們可以通過正則匹配引入相應的文件模塊。

require.context有三個參數(shù):

  • directory:說明需要檢索的目錄
  • useSubdirectories:是否檢索子目錄
  • regExp: 匹配文件的正則表達式
    了解這些之后,我們就可以這樣寫來自動引入 @/src/icons 下面所有的圖標了
const requireAll = requireContext => requireContext.keys().map(requireContext)
const req = require.context('./svg', false, /\.svg$/)
requireAll(req)

復制代碼之后我們增刪改圖標直接直接文件夾下對應的圖標就好了,什么都不用管,就會自動生成 svg symbol了。

  1. 批量下載單個svg文件
    我們上面的操作,在icons里面,一個svg文件就是一個圖標,而阿里圖標庫下載下來的文件是把所有的圖標都合在一個文件里面,這顯然不符合我們的要求,但是一個一個去下載也覺得麻煩,這時可以這樣操作



    點擊批量操作,選擇要添加的圖標,點擊批量加入到購物車,去購物車頁面,點擊下載素材,出現(xiàn)以下頁面,點擊svg即可


參考文章:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容