vue 组件化 svg
解决
- 按需加载,根据使用的
svg动态生成svg-sprite - 按需添加,可以单独添加自定义的
svg图标,不用和原有的svg图标整合在一起再重新下载。
组件
以 vue-cli 生成的项目结构为例,在 components/SvgIcon/index.vue 下创建 svg 的组件
1 | <template> |
使用 svg-sprite
制作 svg-sprite 。可以使用到 svg-sprite-loader , 它是一个 webpack loader ,可以将多个 svg 打包成 svg-sprite 。
在 vue-cli 的基础上进行改造,加入 svg-sprite-loader。
vue-cli默认情况下会使用 url-loader 对svg进行处理,会将它放在/img 目录下,所以这时候引入svg-sprite-loader 会引发一些冲突。
1 | //默认`vue-cli` 对svg做的处理,正则匹配后缀名为.svg的文件,匹配成功之后使用 url-loader 进行处理。 |
此时会有一个问题,并不是所以的 svg 都是用来当做 icon 的,有些可能只是用来当做图片资源的,并且一些第三方类库可能会使用到 svg。
解决方案是使用 webpack 的 exclude 和 include ,让svg-sprite-loader只处理指定文件夹下面的 svg,url-loaer只处理除此文件夹之外的 svg,这样就完美解决了之前冲突的问题。
代码如下
1 | rules:[{ |
自动导入
在 src/icons/svg/ 存放所有的单个 svg 图标
利用 webpack 的 require.context 将所有 svg 图标自动导出,并将 svg 组件注册为全局组件
src/icons/index.js
1 | import Vue from "vue"; |
组件中使用
icon-class 为单个 svg 的文件名
1 | <template> |