一、引入 svg-sprite-loader 插件 vue-cli項目預設情況下會使用 url-loader 對svg進行處理,會將它放在/img 目錄下,所以這時候我們引入svg-sprite-loader 會引發一些衝突。 解決方案:使用 webpack 的 exclude和 include,讓 ...
一、引入 svg-sprite-loader 插件
npm install svg-sprite-loader --save-dev
vue-cli項目預設情況下會使用 url-loader 對svg進行處理,會將它放在/img 目錄下,所以這時候我們引入svg-sprite-loader 會引發一些衝突。
//預設`vue-cli` 對svg做的處理,正則匹配尾碼名為.svg的文件,匹配成功之後使用 url-loader 進行處理。 { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: utils.assetsPath('img/[name].[hash:7].[ext]') } }
解決方案:使用 webpack 的 exclude和 include,讓svg-sprite-loader只處理你指定文件夾下麵的 svg,url-loaer只處理除此文件夾之外的所以 svg,這樣就完美解決了之前衝突的問題。對配置文件進行以下修改:
{ test: /\.svg$/, loader: 'svg-sprite-loader', include:[resolve('src/assets/icons')], options: { symbolId: 'icon-[name]', name: utils.assetsPath('img/[name].[hash:7].[ext]') } }, { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', exclude:[resolve('src/assets/icons')], options: { limit: 10000, name: utils.assetsPath('img/[name].[hash:7].[ext]') } },
二、建立全局組件
建立vue-cli項目,在src/components下建立icon-svg.vue文件。
<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: 50px; height: 50px; vertical-align: -0.15em; fill: currentColor; overflow: hidden; } </style>
在入口文件全局註冊組件
//引入svg組件 import IconSvg from '@/components/icon-svg' //全局註冊icon-svg Vue.component('icon-svg', IconSvg)
操作完成之後就可以在vue文件中使用svg圖標了:
import '@/assets/icons/attach_excel.svg'; //引入圖標 直接使用 <svg><use xlink:href="#icon-attach_excel"/></svg> 全局組件形式使用 <icon-svg iconClass="attach_excel"></icon-svg>
三、添加自動導入svg文件
首先我們創建一個專門放置圖標 icon 的文件夾如:@/src/icons,將所有 icon 放在這個文件夾下。之後我們就要使用到 webpack 的 require.context:
require.context("./test", false, /.test.js$/); 這行代碼就會去 test 文件夾(不包含子目錄)下麵的找所有文件名以 .test.js 結尾的文件能被 require 的文件。 即我們可以通過正則匹配引入相應的文件模塊。
require.context有三個參數:
- directory:說明需要檢索的目錄
- useSubdirectories:是否檢索子目錄
- regExp: 匹配文件的正則表達式
接下來可以在入口文件這樣寫,來自動引入 @/src/icons 下麵所有的圖標:
const requireAll = requireContext => requireContext.keys().map(requireContext) const req = require.context('@/assets/icons', true, /\.svg$/) requireAll(req)
vue文件直接使用:
<icon-svg iconClass="attach_excel"></icon-svg>
參考網址:https://segmentfault.com/a/1190000012213278