引言:最近开始写vue的项目,借鉴了一下vue-element-admin源码,针对vue有一个关于icon图标的处理,最近也找了不少关于vue的icon处理的解决方案,大部分都是按照以前小程序的方式直接引入iconfont项目,而后在外面封装调用样式就能够了。css
文档中推荐的方式是引入svghtml
能够动态地使得图标可访问vue
注:文档中关于svg的介绍webpack
这里准备采用文档中推荐的插件svg-sprite-loader进行介绍css3
注: 用来根据导入的svg文件自动生成symbol标签并插入html,接下来就能够在模板忠方便地使用svg-sprite技术了web
每一个SVG图标均可以更改大小颜色npm
注:张鑫旭大神的介绍-SVG Sprite技术介绍element-ui
npm install svg-sprite-loader --save
在webpack.base.conf.js加入处理svg的loader小程序
{ test: /\.svg$/, loader: 'svg-sprite-loader', include: [resolve('src/icons')], options: { symbolId: 'icon-[name]' } }
这个配置默认导入src文件下的icons文件
src/icons/index
segmentfault
// requires and returns all modules that match const requireAll = requireContext => requireContext.keys().map(requireContext); // import all svg const req = require.context('./assets/svg', true, /\.svg$/); requireAll(req);
而后运行
npm run dev
报错了,此时咱们看咱们的webpack配置
{ test: /\.svg$/, loader: 'svg-sprite-loader', include: path.resolve(__dirname, '../src/assets/icons') }, { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: utils.assetsPath('img/[name].[hash:7].[ext]') } },
下面url-loader中也处理了svg文件,删掉svg处理以后就显示咱们须要的svg了,可是以前的url是咱们element-ui里生成的,须要加上symbol,不去处理src/assets/svgs路径下的svg文件
{ test: /\.svg$/, loader: 'svg-sprite-loader', include: path.resolve(__dirname, '../src/assets/icons') }, { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', exclude: [ path.resolve(__dirname, '../src/assets/icons'), ], options: { limit: 10000, name: utils.assetsPath('img/[name].[hash:7].[ext]') } },
注:require.context,webpack管理依赖
<svg> <use xlink:href="#jisuan" /> </svg>
import '@/assets/icons/jisuan.svg'
固然,这并非最后想要的结果,咱们须要将每一个svg文件整合起来组件化,这样方便之后的调用
创建一个Icon.vue文件
<template> <svg> <use :xlink:href="`#${name}`"></use> </svg> </template> <script> export default { name: 'icon', props: { name: { type: String, required: true, }, }, } </script>
<icon name="jisuan" /> import '@/assets/icons/jisuan.svg'
这里插入每一个svg图标都须要import,在咱们平时写项目的时候js,vue文件都已经实现了自动导入,这里照葫芦画瓢,让src/assets/svg里的文件自动导入
assets/icon/scan.js
const requireAll = requireContext => requireContext.keys().map(requireContext); // import all svg const req = require.context('./assets/svg', true, /\.svg$/); requireAll(req);
main.js
import './assets/scan.js'
参考文档: