引言:最近开始写vue的项目,借鉴了一下vue-element-admin源码,针对vue有一个关于icon图标的处理,最近也找了很多关于vue的icon处理的解决方案,大部分都是按照之前小程序的方式直接引入iconfont项目,然后在外面封装调用样式就可以了。

  • 按照平时导入icon的方法的话有一些已知的缺点
  1. 操作繁琐,每次ui需要加一些新的图标的时候,都要重新下载图标库的项目,然后把整体的文件(其中包括css,svg,ttf,woff等)替换掉。
  2. 如果更改名称的话,需要在图标库里改一次,然后进行下载复制拷贝。
  3. iconfont网站库图标内容有限,特殊业务条件需要uimm们自己设计的图(PSD小图标变身SVG Sprites/font-face历险记)
  • 文档中推荐的方式是引入svg

    使用svg的优点


  1. 图标易于实时修改
  2. 图标可以带动画
  3. 可以使用标砖的prop和默认值来将图标保持在一个典型的尺寸并随时按需改变他们
  4. 图标是内联的,所以不需要额外的HTTP请求
  5. 可以动态地使得图标可访问

     注:文档中关于svg的介绍

  • 这里准备采用文档中推荐的插件svg-sprite-loader进行介绍

    注: 用来根据导入的svg文件自动生成symbol标签并插入html,接下来就可以在模板忠方便地使用svg-sprite技术了

    使用svg-sprite的好处


  1. 页面代码清爽
  2. 可使用ID随处重复调用
  3. 每个SVG图标都可以更改大小颜色

    注:张鑫旭大神的介绍-SVG Sprite技术介绍

    安装插件

npm install svg-sprite-loader --save

webpack配置

在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

// requires and returns all modules that matchconst 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'

参考文档:

  • https://segmentfault.com/a/1190000015367490
  • https://cisy.me/webpack-svg-sprite/

转载于:https://www.cnblogs.com/teemor/p/9565841.html

【vue】webpack插件svg-sprite-loader---实现自己的icon组件相关推荐

  1. vue ---- webpack -插件 html-webpack-plugin

    该插件解决的问题: 访问http根目录时,没有直接访问到src下得index.html 该插件会将src下的index.html 复制一份,放到根目录下一份 作用: ① 通过HTML插件复制到项目根目 ...

  2. vue 常用插件集合(最全)

    UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 mint-ui- Vue 2的移动UI元素 iview- 基于 Vuejs 的开源 UI ...

  3. vue常用插件,可自定义选择。vue demo

    UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 mint-ui- Vue 2的移动UI元素 iview- 基于 Vuejs 的开源 UI ...

  4. vue svg sprite loader_Vue项最佳实践

    资源 Vue-CLI 3.0:https://cli.vuejs.org/zh/guide/webpack.html vue-element-admin:https://github.com/PanJ ...

  5. vue+webpack 安装常见插件

    html-webpack-plugin 插件地址:https://www.npmjs.com/package... 安装指令: npm install html-webpack-plugin --sa ...

  6. 实用VUE 开发插件!!前端必备

    element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的组件库 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开源 UI ...

  7. 从零构建vue+webpack (一)

    写在前面: 给自己看,日常写业务有点儿繁琐,尝试着用vue+webpack 从零开始构建一个项目! 1.新建项目文件夹 运行命令 npm init (一路回车或者-y) 2.打开项目,新建src 文件 ...

  8. vue webpack打包入口文件是哪个_Vue 学习笔记(二十五):webpack 相关

    Webpack 是什么 Vue CLI Webpack 相关 Webpack 更多参考官方文档 Webpack 是一个前端资源加载/打包工具.它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定 ...

  9. 一字一句的搞懂vue-cli之vue webpack template配置

    webpack--神一样的存在.无论写了多少次,再次相见,仍是初见.有的时候开发vue项目,对尤大的vue-cli感激涕零.但是,但是,但是...不是自己的东西,真的很不想折腾.所以,我们就得深入内部 ...

最新文章

  1. 计算机一级考试试题 文明,XP计算机文明基础模拟试题库1.doc
  2. VMware虚拟机安装红帽系统无法上网解决办法(转)
  3. python绘图内容怎么保存_将绘图保存到图像文件,而不是使用Matplotlib显示 - python...
  4. boost::fill相关的测试程序
  5. MQTT协议笔记之mqtt.io项目TCP协议支持
  6. e4a服务器文件,e4a链接网站服务器
  7. python如何搜索关键字_Python遍历目录和搜索文件中的关键字
  8. apscheduler executors
  9. 计算机专业指南作业6,计算机专业指南的学习心得体会
  10. Flex入门的好书——《Flex3 Cookbook 中文版》
  11. 【配送路径规划】基于matlab模拟退火算法求解单配送中心多客户多车辆最短路径规划问题【含Matlab源码 1604期】
  12. Pr入门系列之十四:处理音频
  13. 开源 | 写了个微博去广告、屏蔽拉黑插件
  14. matlab运行出现:Optimization terminated.
  15. re正则表达式过滤标题特殊字符,只保留中英文及数字
  16. 信号处理中使用IPP库函数的基本设置
  17. 《Xenogears》(异度装甲)隐含的原型与密码
  18. IDEA中好用的功能(不断更新中)
  19. ‘‘红包来了—红包来了—‘‘Python制作一个微信红包提示系统。
  20. Transfomer详解

热门文章

  1. linux 下升级apache,CentOS6.5在已有低版本环境下安装升级Apache+MySQL+PHP,centos6.5apache...
  2. matlab中的scramble函数,matlab 中 hold on 和hold off的使用
  3. 标准库类型string的基本功能和使用
  4. 多个Activity与Fragment之间的数据传递
  5. CentOS7 安装 MySQL 和简单优化
  6. [BUUCTF-pwn]——[BJDCTF 2nd]r2t3
  7. Shell——流程控制(if、case、for、while)
  8. 排序算法——快速排序算法
  9. c++内存管理-分配失败
  10. jsp springmvc 视图解析器_SpringMVC学习笔记