检索项目中冗余的图片

news/2024/10/22 7:59:57/

说在前面

平时在项目中我们会使用到一些图片,很多时候我们会直接将图片打包到项目中去,随着项目的更新迭代,我们可能会删除一些图片的引用,但没将图片源文件删除,这个时候没有被引用到的图片就会成为冗余的文件,而且图片文件的大小一般都会比较大,这个时候就会使得项目的体积白白增大了,所以现在我们可以制作一个简单的检索脚本来找出项目中未被应用的图片资源,将没用过的图片删除的话可以缩小项目包的体积,对打包速度也有一定的优化。

思路分析

实现步骤

  • 1、获取图片资源

首先我们需要先获取到项目中所有的的图片资源文件,一般图片资源都会有一个目录来单独存放,我们只需要获取该目录下的文件列表即可:

这里我将图片都放在了image目录下,所以直接读取image目录获取到该目录下的所有图片文件即可,如果有多级目录存放的话,我们就需要递归进行获取了。

const imageList = fs.readdirSync("./image");
  • 2、遍历项目文件目录文件

一般我们的项目文件目录都是会有多层嵌套的,这里我模拟创建了一个简单的目录机构,具体结构如下图:

image.png

这种时候我们需要递归去遍历每一级目录,获取到所有的文件,我们需要这样做:先获取当前目录下的所有文件和目录,遍历判断是文件还是文件夹,是文件的话我们可以直接获取文件文本内容来判断是否存在图片列表中的图片,否则则需要递归去获取下级目录文件,具体代码如下:

const findImg = (dir = "./src") => {const fileList = fs.readdirSync(dir);fileList.forEach((item) => {const path = dir + "/" + item;if (fs.statSync(path).isFile()) {const content = fs.readFileSync(path, "utf8");imageList.forEach((image) => {if (content.includes(image)) {if (!res[path]) res[path] = [];res[path].push(image);}});} else {findImg(path);}});
};

局限

这种检索方法只适用于搜索在代码中直接引入路径的图片文件,如果是通过接口返回的图片名字或路径来进行动态引入的话,我们则无法通过这个脚本检索到。

完整代码

const fs = require("fs");
const imageList = fs.readdirSync("./image");
console.log("imageList", imageList);
const set = new Set(imageList);
const res = {};
const findImg = (dir = "./src") => {const fileList = fs.readdirSync(dir);fileList.forEach((item) => {const path = dir + "/" + item;if (fs.statSync(path).isFile()) {const content = fs.readFileSync(path, "utf8");imageList.forEach((image) => {if (content.includes(image)) {if (!res[path]) res[path] = [];res[path].push(image);set.delete(image);}});} else {findImg(path);}});
};
findImg();console.log(res);
console.log(set);

image.png

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,在此谢谢大家的支持,我们下文再见 🙌。


http://www.ppmy.cn/news/345115.html

相关文章

2023网络安全面试题汇总(附答案)

大家好,我是小V ,本人 17 年就读于一所普通的本科学校,20 年 6 月在三年经验的时候顺利通过校招实习面试进入大厂,现就职于某大厂安全联合实验室。 又到了毕业季,大四的漂亮学姐即将下架,大一的小学妹还在来的路上&…

C++ 中的运算符重载

您可以重定义或重载大部分 C 内置的运算符。这样,您就能使用自定义类型的运算符。 重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。…

独家揭秘:Kotlin K2编译器的前世今生

独家揭秘:Kotlin K2编译器的前世今生 也许您已经观看了最近的 KotlinConf 2023 主题演讲,关于 K2 编译器的更新。什么是 K2 编译器? 在搞清楚这个问题之前,我们需要了解Kotlin 使用的不同种类的编译器及其差异,以及编…

如何通过自养号测评在TEMU跨境电商平台中获取更大市场份额

2023年可谓是TEMU跨境电商平台的元年。自从2022年8月17日拼多多宣布将筹备跨境电商平台以来,TEMU犹如烈火燎原,迅速蔓延全球。9月1日,首站TEMU在北美市场正式上线,平台名称取意“Team Up,Price Down”,紧扣…

429. N 叉树的层序遍历

2023.6.12 二叉树是先加左节点再加右节点,n叉树是一个循环把所有节点加到队列尾部 """ # Definition for a Node. class Node:def __init__(self, valNone, childrenNone):self.val valself.children children """class Solution:…

音频转文字软件有哪些?推荐几个录音转文字工具

无论在工作还是学习上,一下子记不住太多信息,得依靠录音来记录,例如采访、课堂录音、做会议记录等等。那么大家是否有这个困扰?在后期整理十分麻烦,需要慢慢反复地去听,甚至出现嘈杂的声音而不能听清楚原声…

推荐三款实用的录音转文字软件给你

作为一名职场新人,我们经常需要向他人请教一些工作上的问题,为了防止我们遗漏一些重要的事项,我们就会经常使用录音的方式来将他人传授的经验记录下来,一些较短的录音我们可以采用边听边手动输入的方式,将它们变成一个…

多对一(association)、一对多(collection)

1、多对一的处理 多对一的理解: 多个学生对应一个老师如果对于学生这边,就是多对一的现象,即从学生这边关联一个老师! 1.1、数据库的设计 CREATE TABLE teacher ( id INT(10) NOT NULL, name VARCHAR(30) DEFAULT NULL, PRIMAR…