如何在vue輕鬆使用svg? — svg-sprite-loader

Joe Chang
Coding Hot Pot
Published in
Oct 25, 2022
photo by joshua_j_woroniecki

在開發網站的時候,如果需要用到icon的話我們通常會使用Font Awesome這類的工具來滿足我們的需求,但更多時候我們需要使用客制化的icon,因此UIUX設計師會提供svg的檔案給前端工程師來做使用,那麼此時會有幾種方式來使用這些svg

  • 把svg轉換成font字型檔引用

我們可以將svg上傳到icomoon 、iconfont這類的網站幫我們生成字型檔之後,再寫一些設定就可以將svg拿來當作font使用,缺點是維護較為麻煩,每次icon有新增修改都必須先上傳svg到網站上再下載字型檔,而且近期iconfont蠻不穩定的,很常不能上傳,造成許多開發者的困擾

  • 以inline的方式使用svg

這個方式最簡單,直接複製svg的path然後一股腦的貼上html即可,也可自行修改icon的顏色,但可讀性實在是非常的差,所以基本上應該沒有人會使用這個方法

  • 把svg直接當img引入

無法修改svg的顏色,使用上比較不彈性

  • 把svg當作component使用

理想的狀況是我們可以將svg當作元件使用,只要帶入svg的名稱就能夠使用指定的svg,此時就是svg-sprite-loader登場的時候了! svg-sprite-loader的原理是將svg一個一個放進symbol拼成雪碧圖,如下圖

svg雪碧圖會生成在body起始標籤的後面

需要用到指定的svg時就用use標籤引用,並且將連結設為svg的id,指定的svg就會顯示在畫面上

對於 svg-sprite-loader有了基本概念之後,就可以來實作了,這次使用vue3 + vue cli開發

svg-sprite-loader 的設定步驟

先安裝 svg-sprite-loader

yarn add svg-sprite-loader -D

vue.config.js設定

由於src/assets/icons底下的svg要作成雪碧圖,因此webpack的svg loader要排除該資料夾,否則會無法生成svg雪碧圖

options的"[name]"指的是以檔名來作為id

每當要使用icon的時候,都必須手動引入對應的svg,實在是很麻煩,因此我們可以在main.js使用webpack的require.context方法,一口氣引用所有的svg檔案,一勞永逸!

icon 元件

為了方便使用,接下來建立一個icon component,props帶入svg的檔名就可以使用對應的svg,也能夠帶入尺寸,控制icon的大小

記得加上fill currentColor,svg才會繼承父層容器所設定的顏色,如果改不動顏色應該是svg本身有設定顏色,記得請設計師去掉

假設每次要使用icon元件都需要寫一次引用就會變得有點繁瑣,因此我們可以將Icon元件設為全域的元件

最後就可以隨心所欲的使用icon 元件了!

--

--

Joe Chang
Coding Hot Pot

前端工程師,唯有非常努力,才能看起來毫不費力