svgo-loader配合svg-sprite-loader使用,网上教程很多,不赘述

  const svgRule = config.module.rule("svg-sprite");
svgRule.uses.clear(); svgRule
.test(/\.(svg)(\?.*)?$/)
.include.add([resolve("src/icons")])
.end()
.use("svg-sprite-loader")
.loader("svg-sprite-loader")
.options({
symbolId: "icon-[name]"
})
.end()
.use("svgo-loader")
.loader("svgo-loader")
.tap(options => ({
...options,
plugins: [{ name: "removeAttrs", params: { attrs: "fill" } }]
}))
.end();

那么问题来了,并不是所有的svg都需要去除颜色样式。有些不用自己改色,或者本身很复杂多颜色的svg,前端自己上色肯定是有问题的

那这种链式操作如何解决呢,我把链式操作分了两步(笑哭)

第一步使用svg-sprite解析所有的icons文件夹下的svg文件

第二步使用svgo-loader去除除了‘original’文件夹下的svg文件

  // 第一步
const svgRule = config.module.rule("svg-sprite");
svgRule.uses.clear();
svgRule
.test(/\.(svg)(\?.*)?$/)
.include.add([resolve("src/icons")])
.end()
.use("svg-sprite-loader")
.loader("svg-sprite-loader")
.options({
symbolId: "icon-[name]"
})
.end(); // 第二步
const svgoRule = config.module.rule("svgo");
svgoRule
.test(/\.(svg)(\?.*)?$/)
.exclude.add([resolve("src/icons/common/original")])
.end()
.use("svgo-loader")
.loader("svgo-loader")
.tap(options => ({
...options,
plugins: [{ name: "removeAttrs", params: { attrs: "fill" } }]
}))
.end();

到此解决了original文件夹下svg不删除fill的逻辑

那么在前端架构时,公共的svg放在common下,每个项目用到的svg放到每个子文件夹下,就会存在多个文件夹不需要去修改svg

在icons文件夹下拿到所有的original文件,exclude掉

    const findFileFolder = (dir, filename) => {
const files = fs.readdirSync(resolve(dir));
const result = [];
files.map(file => {
const filePath = `${dir}/${file}`;
if (fs.statSync(filePath).isDirectory()) {
if (file === filename) {
result.push(filePath);
} else {
result.push(...findFileFolder(filePath, filename));
}
}
});
return result;
}; // svgo-loader 去除svg文件中的fill属性,方便前端更改颜色
// 对于不需要更改颜色的svg,
// 在对应文件夹(common/(项目名1)/(项目名2)/...)中创建子文件夹
// 命名为“original”(!!必须!!)
// 将不会更改颜色(多颜色)的svg放入original文件夹,默认不loader此文件夹文件
const svgoRule = config.module.rule("svgo");
const svgoExcludePaths = findFileFolder("src/icons", "original");
svgoRule
.test(/\.(svg)(\?.*)?$/)
.exclude.add([...svgoExcludePaths.map(path => resolve(path))])
.end()
.use("svgo-loader")
.loader("svgo-loader")
.tap(options => ({
...options,
plugins: [{ name: "removeAttrs", params: { attrs: "fill" } }]
}))
.end();

使用svgo-loader只对部分文件生效的更多相关文章

  1. ApexSQLLog可以只读取ldf文件

    ApexSQLLog可以只读取ldf文件 需要数据库在线 本文版权归作者所有,未经作者同意不得转载.

  2. HTML input="file" 浏览时只显示指定文件类型 xls、xlsx、csv

    html input="file" 浏览时只显示指定文件类型 xls.xlsx.csv <input id="fileSelect" type=" ...

  3. <input type="file" />浏览时只显示指定文件类型

    <input type="file" />浏览时只显示指定文件类型 <input type="file" accept="appli ...

  4. findstr 只搜寻指定文件类型

    Title:findstr 只搜寻指定文件类型 --2012-05-04 09:27 findstr /i /m /S /C:"关键字"  *.php *.asp *.jsp

  5. Linux显示只显示目录文件

    Linux显示只显示目录文件 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ls -l -d */ drwxr-xr-x 2 root root 4096 1 ...

  6. webpack学习笔记一:安装webpack、webpack-dev-server、内存加载js和html文件、loader处理非js文件

    一 .webpack学习环境准备: 1:window系统 2:安装node.js  官方网址 下载好后下一步下一步安装即可 安装步骤略过....... 3:nrm的安装 打开cmd命令控制台 输入:n ...

  7. SQLLoader7(只导入数据文件的其中几行记录)

    数据文件: D:\oracletest\test1.txt SMITH CLERK ALLEN SALESMAN WARD SALESMAN JONES MANAGER MARTIN SALESMAN ...

  8. SQL LOADER 的用法 TXT文件导入非常之快

    前提,需要本地安装ORACLE 客户端 控制文件 cms.ctl load dataCHARACTERSET UTF8infile 'oracle.txt'APPEND INTO TABLE JR f ...

  9. 如何让.gitignore文件生效

    改动过.gitignore文件之后,在repo的根目录下运行 # 先将当前仓库的文件的暂存区中剔除 git rm -r --cached . # 再添加所有的文件到暂存区,这时.gitignore文件 ...

  10. Intellij 设置只更新静态文件(js、view、css)的方法

    1.打开 Tomcat Run/Debug configuration 2.打开Deployment标签 3.在“Deploy at Server Startup” 中,移出现有的.war 包 4.点 ...

随机推荐

  1. Go实现网络代理

    使用 Go 语言开发网络代理服务可以通过以下步骤完成.这里,我们将使用 golang.org/x/net/proxy 包来创建一个简单的 SOCKS5 代理服务作为示例. 步骤 1. 安装 golan ...

  2. 强化学习从基础到进阶-常见问题和面试必知必答[4]::深度Q网络-DQN、double DQN、经验回放、rainbow、分布式DQN

    强化学习从基础到进阶-常见问题和面试必知必答[4]::深度Q网络-DQN.double DQN.经验回放.rainbow.分布式DQN 1.核心词汇 深度Q网络(deep Q-network,DQN) ...

  3. 从嘉手札<2024-1-17>

    昨天我以为 人生是一场体验 是一辆不会回头的列车 我们遇到了风景 感悟了风景 放下了风景 构成了自己 今天我以为 静水流深.光而不耀 可多思必多疑 思维是一种极为复杂的东西 我曾经觉得知行合一是对自我 ...

  4. Docker从认识到实践再到底层原理(八)|Docker网络

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总 然后就是博主最近最花时间的一 ...

  5. 基数排序|RadixSort|C++实现

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量干货博客汇总https://blog. ...

  6. 【OpenCV】基于cv2的图像阈值化处理【超详细的注释和解释】掌握基本操作

    说在前面的话 博主今天给大家带来人工智能的一个重要领域的入门操作,opencv包的使用和基本操作,希望大家可以从中学到一些东西! 前言 那么这里博主先安利一下一些干货满满的专栏啦! 手撕数据结构htt ...

  7. opcache导致的RCE复现

    前言 RCE得搭配着文件上传的点来进行利用 环境搭建 用docker搭个php7的环境,作者用的php7.0 docker run -itd --name php7 -p 8083:80 php:7. ...

  8. python常用的搜索字符内容函数详解:re.findall/findfiter

    区别findall返回listfinditer返回一个MatchObject类型的iterator详细举例介绍1.findall在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹 ...

  9. STM32F401+nRF24L01无线传输音频(对讲机原型)

    尝试结合STM32F401的ADC, PWM, SPI(NRF24L01)和TIM, 试验了一下音频的无线传输(对讲机原型) 工作机制 音频采样 因为硬件的限制, 包括STM32F401片内存储, 内 ...

  10. 【Unity3D】刚体组件Rigidbody

    1 前言 ​ 刚体(Rigidbody)是运动学(Kinematic)中的一个概念,指在运动中和受力作用后,形状和大小不变,而且内部各点的相对位置不变的物体.在 Unity3D 中,刚体组件赋予了游戏 ...