扩展Laya查找未被使用的资源,一键删除项目中未引用资源功能(功能开发)

laya 简易图片资源管理 话不多说,直接上代码。 /** 自动释放资源图片类 addbuy zhuxl 2021/8/3 */ export default class ZAutoImage extends Laya.Image{ constructor() { super() } set skin(url:string) { if (this._skin == url) return; this._skin = url; if (url) { this.off(Laya.Event.DISPLAY, this, this. 阅读详情

-前言-

不知道你知不知道Laya有一个查找未被使用的资源功能,在UI编辑器状态下按F4弹出,不过这个功能实在鸡肋,只能查找在page中引用过的资源,但是我们正常开发下很多资源是在代码中,或者配置到配置档中的,所以需要根据自己的需求更改。如果放到Unity我估计就放弃了,直接写脚本来跑删除逻辑,不过既然Laya是开源引擎,引擎代码又是基于nodejs环境写的,那通过简单修改就能实现我们想要的结果了。

-正文-

找到对应逻辑代码

首先到你Laya的安装目录下找到resources->app->out->vs->layaEditor->layabuilder.max.js,关于IDE相关的代码就在这里。app目录是自带nodejs环境的,因此我们可以调用诸如fs这些文件操作API。控制查找未被使用资源的面板名称为FindUnUsedRes。我们所要实现的功能主要就着手修改这个类。

//当我们点击查找按钮之后的逻辑处理
__proto.onFindBtnClick=function(e){
	this.resultBox.visible=true;
	this._arr=ResManager.findUnUsed();
	this.msgTxt.text=Sys.lang("共找到 {0} 个资源",this._arr.length);
	this.checkSelectAll.selected=true;
	this.onCheckSelectAllChange(null);
	this.checkSelectAll.on("change",this,this.onCheckSelectAllChange);
}

找到这里就好说了,我们修改find规则就能符合我们想要查找的资源类型。

修改UI界面

作为一个合格的前端肯定要符合我们使用习惯,在不修改现有使用的情况下,我们添加两个复选框,codeCheck及whiteListCheck,这两个复选框选中后我们就去代码中匹配资源以及在我们定义的白名单中匹配资源。LayaIDE用的UI库与我们项目开发中使用的UI库是一样的,熟悉Laya的同学应该会熟悉这套UI框架。

//构造函数
function FindUnUsedRes(){
	this._arr=null;
	this.isCodeChange=false;
	FindUnUsedRes.__super.call(this);
	this.findBtn.on("click",this,this.onFindBtnClick);
	this.list.mouseHandler=new Handler(this,this.onList);
	this.delBtn.on("click",this,this.onDelBtnClick);

	//以下为我们自己添加的代码
	this.codeCheck = new CheckBox("comp/checkbox.png");
	this.codeCheck.pos(this.findBtn.x + this.findBtn.width + 20,
		this.findBtn.y + this.findBtn.height / 2 - this.codeCheck.height / 2);			
	this.addChild(this.codeCheck);
	var tfCodeCheck = new Label("查找代码");
	tfCodeCheck.fontSize = 14;
	tfCodeCheck.color = "#ffffff";
	tfCodeCheck.pos(this.codeCheck.x + this.codeCheck.width + 5,this.codeCheck.y);
	this.addChild(tfCodeCheck);

	this.whiteListCheck = new CheckBox("comp/checkbox.png");
	this.whiteListCheck.pos(this.codeCheck.x,this.codeCheck.y + this.codeCheck.height + 5);
	this.addChild(this.whiteListCheck);

	var tfWhite = new Label("检测白名单");
	tfWhite.fontSize = 14;
	tfWhite.color = "#ffffff";
	tfWhite.pos(this.whiteListCheck.x + this.whiteListCheck.width + 5,this.whiteListCheck.y);
	this.addChild(tfWhite);
}

以上我们添加了两个复选框以及复选框的说明文本,不过目前还没有实现对应筛选逻辑,我们重启或者刷新IDE按F4查看变化如下。

处理查询逻辑

查询逻辑通过ResManager->findUnUsed接口查询未被使用的资源。之前是没有参数的查询,为了实现我们的功能,我们把两个复选框的状态传入这个接口,当复选框选上的时候就执行我们新写上去的逻辑。

ResManager.findUnUsed=function(isCodeCheck,useWhiteList){
    //以下为新加代码
	(isCodeCheck===void 0) && (isCodeCheck= false);
	(useWhiteList===void 0) && (useWhiteList = false);
    //以上为新加代码

	var reses;
	reses=ResFileManager.getAllResLinkList();
	var pages=FileManager.getFileList(FileManager.getWorkPath("laya/pages/"));
	var i=0,len=0;
	var a;
	for(var $each_a in pages){
		a=pages[$each_a];
		var path=a;
		if(FileTools.isDirectory(path))continue ;
		var txt=FileManager.readTxtFile(path);
		for (i=reses.length-1;i >-1;i--){
			var item=reses[i];
			if(item.indexOf("@")>=0||item.indexOf("$")>=0){
				reses.splice(i,1);
				continue ;
			}
			if (txt.indexOf("\""+item+"\"")!=-1){
				reses.splice(i,1);
			}
		}
	};
    //以下为新加代码
	if(useWhiteList){
        //读取项目根目录下unusewhitelist.json配置
		var white = FileManager.readJSONFile(FileManager.getWorkPath("") + "\\unusewhitelist.json");
		if(white instanceof Array && white.length > 0){
			for(i=reses.length - 1;i > -1;i--){
				var item = reses[i];
				if(item.indexOf("@")>=0||item.indexOf("$")>=0){
					reses.splice(i,1);
					continue ;
				}
				for(var j = 0;j < white.length;++j){
					var wi = white[j];
					if(item.indexOf(wi) != -1){
						reses.splice(i,1);
						break;
					}
				}
			}
		}
	}

	if(isCodeCheck){
        //直接读取bin目录下经过编译打包后的bundle.js文件
		var codes = FileManager.getFileList(FileManager.getWorkPath("bin/js/"));
		for(var jsI in codes){
			var jsPath = codes[jsI];
			if(FileTools.isDirectory(jsPath))continue ;
			var txt = FileManager.readTxtFile(jsPath);
			for(i=reses.length - 1;i > -1;i--){
				var item = reses[i];
				if(item.indexOf("@")>=0||item.indexOf("$")>=0){
					reses.splice(i,1);
					continue ;
				}
				if (txt.indexOf("\""+item+"\"")!=-1){
					reses.splice(i,1);
				}else{
					var gR = item.split(new RegExp("\\d+"));							
					if(txt.indexOf("\""+gR[0]+"\"") != -1){
						reses.splice(i,1);
					}//TODO 增加匹配_
				}
			}
		}
	}
    //以上为新加代码
	var rst;
	rst=[];
	len=reses.length;
	for(i=0;i<len;i++){
		rst.push({label:reses[i],path:FileManager.getResPath(reses[i])});
	}
	return rst;
}

上面代码中注释之间的就是我们新加上的处理代码,逻辑其实很简单,就是字符串匹配。如果你有别的匹配需求还有可以写别的,我这里只是抛砖引玉,代码本身的性能也没去考虑过。主要是为了实现功能。

第一个循环是Laya默认从page中查询的逻辑,第二个是从我们定义的白名单中的查询逻辑,第三个循环是从bundle.js中查询的逻辑。

当我们没有白名单的时候即使选上了查询也不会进行查询,因此我们需要配置一个白名单,名字与代码中取的名字一样就行,我这里的名字叫做unusewhitelist.json,放到项目的根目录。

这个白名单根据你自身的项目需求去配置文件名前缀后缀或者部分文件名都可以。

输出查询日志

既然都修改了代码了,我们就完成最后一步,将我们查询日志输出到项目根目录中,之前在Laya中我们查询是没办法将查询结果选中的,因此我们可以将其结果输出到一个文件中,供我们参考。这一步就要回到我们的查询结果之后去处理。修改onFindBtnClick函数。

__proto.onFindBtnClick=function(e){
	this.resultBox.visible=true;
	this._arr=ResManager.findUnUsed(this.depthCheck.selected,this.whiteListCheck.selected);
	this.msgTxt.text=Sys.lang("共找到 {0} 个资源",this._arr.length);
	this.checkSelectAll.selected=true;
	this.onCheckSelectAllChange(null);
	this.checkSelectAll.on("change",this,this.onCheckSelectAllChange);
	//将结果输出
	FileManager.createJSONFile(FileManager.getWorkPath("") + "\\finunusedLog.json",this._arr);
}

这里我们将查询结果输出到了项目根目录下的finunuseLog.json文件中供我们参考查询。至此我们所有功能已经实现。如果你觉得还不够可以自行修改来满足自己的功能。下面我们来比较下查询结果与之前的不同。

未使用我们修改的查询结果
使用了我们修改的结果

由上面结果可见,我们代码中还有很多动态引用图片资源的代码,这样修改之后就敢放心大胆的删除不需要的资源了。

利用抽象语法树还原Uglify打包的js混淆代码 本文讲一下使用AST(抽象语法树)对Uglify压缩的JS代码还原相关的操作。本文只大概讲还原算法供学习使用,不保证完全当工具使用。后面使用的代码我会提供部分关键java代码文件。 阅读详情

相关推荐

手把手教你用C语言实现GNSS卫星方位角计算(附RTKLIB风格代码解析)

本文详细介绍了如何使用C语言实现GNSS卫星方位角计算,包括从地固坐标系到站心坐标系的转换链条。通过RTKLIB风格的代码解析,展示了XYZ到ENU坐标转换的核心原理和C语言实现框架,帮助开发者掌握卫星方位角和高度角的计算技巧,适用于GNSS观测数据质量分析和精密定位算法开发。

weixin_30699915的博客 365

Laya学习笔记-Sprite-1.7.10

一个标题一段代码加载图片//初始化引擎 Laya.init(1080, 600); Laya.stage.bgColor = "#fff"// 方法1:使用loadImage var spl:Sprite = new Sprite(); Laya.stage.addChild(spl); spl.loadImage("../../laya/assets/comp/monkey2.png");//设置

傅鹏程的博客 1711

在Ubuntu22.04.2远程服务器上搭建OHIF+Orthanc

在Ubuntu远程服务器上不翻墙,但是本地windows需要科学上网开始之前,首先在终端输入export -p查看是否有代理端口如下如果有就关了,输入如下命令。

weixin_51116549的博客 1339

Laya2.0 是如何管理资源的?

贴图资源:Loader.textureMap。所有资源:Loader.loadedMap。Laya资源加载类,主要是Loader。针对Loader资源的一个处理。Resource存放字典。Resource销毁。Resource子类。

wangwen_22的博客 810

全面解析:时延扩展与相干带宽、多普勒扩展与相干时间——无线通信基础

时延扩展与相干带宽 多径时延扩展与多径衰落 接收机所接收到的信号是通过不同的直射、反射、折射等路径到达接收机。由于电波通过各个路径的距离不同, 因而各条路径中发射波的到达时间不同,造成多径时延扩展。距离不同所以到达接收机的相位也不相同,不同相位的多个信号在接收端叠加, 如果同相叠加则会使信号幅度增强, 而反相叠加则会削弱信号幅度。 这样,接收信号的幅度将会发生急剧变化,就会产生多径衰落。 ...

king阿金 4万+

linux下redhat6.8(理论是都适用)安装oracle12c---详细教程

1、配置yum源 1)、删除Redhat自带的yum: (2)、上传centos的yum包,并按照顺序安装,所需的rpm包通过点击这里获取(放在oracle文件中的centos yum):上传到linux中 进行安装 yum包链接:https://pan.baidu.com/s/1TxciCWEd7d-d4kGoea0L1w 提取码:eufp `` --注意后面两个安装包一起安装 ## 3)、更改系统yum源: 编辑rhel-source.repo文件,将其中的$releas

z931407229的博客 1149

判断资源是否被引用,判断资源是否被循环引用

在系统中,总是会遇到需要判断引用的场景,如自定义方法模块,方法A里面调用了方法B,方法B里调用了方法A,这样自己就会造成循环引用。甚至于方法A里面调用了方法B,方法B里调用了方法C,方法C里面调用了方法A。这样的乃至更深层次的循环调用,那该怎么办呢,我这里设计了一个数据结构,来解决这个问题。 /** * @author LaiYongBin * @date 创建于 2022/4/14 20:54 * @apiNote flink cep pattern引用关系数据结构 */ public class

qq_44741568的博客 838

DataX对接数据如何在ODS加密脱敏数据(插件开发)

datax对接mysql数据,对姓名只保留姓,名变成**。对这种简单的脱敏,可以不用修改datax源码,直接在配置文件上实现。

大模型大数据攻城狮的专栏 994

Laya编辑器二次开发(二)预览界面中添加图片尺寸信息展示

Laya提供的预览界面可以展示选择目录下的资源文件。图片类型资源提供图片的的缩略图显示。在 这里我们想要让列表中的元素展示更多的信息,比如图片的尺寸信息。 接下来就来实现第一个二次开发的功能,预览界面列表元素信息扩展。 首先在layabuilder.max.js文件中搜索“预览”关键字,匹配项只有5个。通过简单的文字修改 测试,定位到预览界面关联的类为ResViewerPanel。 简单浏览一下该类,发现预览内容的容器为list组件,这样我们只要找到list的render类,就..

lanuo的专栏 720

4-20mA电流信号转电压

该电路实现4-20mA电流信号转电压(0.44-2.2V)调理功能,采用两级运放设计:第一级LMH6642MFX进行11倍放大,第二级配置为缓冲器加二阶低通滤波。电路包含10Ω采样电阻、多级RC滤波和ESD防护,具有抗干扰强、功耗低(4mW)等特点,适配3.3V系统ADC采集。通过使能控制MOS管可实现节能模式,适用于工业自动化、环境监测等场景。设计合理平衡了信号精度与功耗,输出电压范围留有充足余量避免饱和。

qq_37999850的博客 306

【Claude Code】Not logged in 未登录错误解决方案 + /login 认证路径

Claude Code 启动时提示 Not logged in 表示当前会话缺少有效凭证。本文从环境变量、API Key 配置、CI 自动化凭证脚本和系统时钟四个维度,提供完整的认证排查流程与修复方案。

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 894

laya2.0 删除无用图片引用

-前言- 不知道你知不知道Laya有一个查找未被使用的资源功能,在UI编辑器状态下按F4弹出,不过这个功能实在鸡肋,只能查找在page中引用过的资源,但是我们正常开发下很多资源是在代码中,或者配置到配置档中的,所以需要根据自己的需求更改。如果放到Unity我估计就放弃了,直接写脚本来跑删除逻辑,不过既然Laya是开源引擎,引擎代码又是基于nodejs环境写的,那通过简单修改就能实现我们想要的结果了。 -正文- 找到对应逻辑代码 首先到你Laya的安装目录下找到resources->app-&gt

weixin_41640571的博客 361

教师模型与学生模型:知识蒸馏的核心概念

知识蒸馏,教师模型,学生模型,模型压缩,迁移学习,深度学习 1. 背景介绍 深度学习模型在图像识别、自然语言处理等领域取得了显著的成就,但其巨大的模型规模和高昂的计算成本限制了其在资源有限的设备上的部署。知识蒸馏(Knowledge Distillation)作为一种模型压缩技术,旨

AI架构师小马 2772

KotlinUdemy集合框架应用:优化应用性能的集合选择指南

KotlinUdemy项目是一个全面的学习资源,专注于教授如何使用Kotlin开发Android应用和在线游戏,如Pokémon、Twitter、井字棋和记事本等。在Kotlin开发中,集合框架是构建高效应用的基础,选择合适的集合类型直接影响应用性能和用户体验。本文将详细介绍Kotlin集合框架的核心类型及其应用场景,帮助开发者优化应用性能。 ## 一、Kotlin集合框架概述 Kotlin集

gitblog_00250的博客 352

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Laya的粒子效果

参考: UI页面、粒子、动画、脚本新建面板详解 Laya版本:2.5.0 一创建一个粒子效果 在UI编辑界面右键-> 新建 -> 粒子 粒子有重力模式和半径模式 重力模式:粒子是一个角度向另一个方向呈发射式的粒子效果 半径模式:围绕中心点为半径的旋转式粒子效果 两个模式除了初始参数不同,没有什么区别。你可以创建一个重力模式粒子,然后通过调整参数,实现半径模式的效果。 新建的粒子文件是Scenes/particle/TestParti...

xuniwawa010的专栏 2394

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Laya的一些常用的方法,环境判断、向量操作等

设备 是否在 Android 设备内:Laya.Browser.onAndroid 是否在 IOS 设备内:Laya.Browser.onIOS 判断QQ小游戏环境:Laya.Browser.onQQMiniGame 判断微信小游戏环境:Laya.Browser.onWeiXin 设备像素分辨率宽度:Laya.Browser.clientWidth 设备像素分辨率高度:Laya.Browser.clientHeight 获取设备像素比:Laya.Browser.pixelRatio 设备物理

qq_38721111的博客 1667

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Laya:资源管理器。

此管理器主要用于加载Unity导出的资源,如3D场景,3D预制体等等。代码如下: /** * Unity导出资源管理器 */ export default class ResMgr extends Laya.Script { private unityResMap = new Map(); //预制体字典:Map<string,Laya.Sprite3D> public static Instance: ResMgr; constructor() {

luojialing2的博客 2147

LayaAir destroy 销毁与 removeChild 移除节点

  目录 destroy  释放内存 编码示例 removeChild 移除节点 destroy  销毁节点 1、JavaScript 运行时无法启动垃圾回收器,要确保一个对象能够被回收,需要删除对该对象的所有引用。Sprite 提供的 destory() 方法会帮助设置对象内部引用为 null。 2、例如,以下代码确可保对象能够被作为垃圾回收: var sp = new Lay...

蚩尤后裔-汪茂雄 8384

Laya编辑器二次开发(一)找到需要操作的文件

写在前面: 本系列教程非系统性的介绍Laya编辑器的结构及组织方式,只是通过分享一些二次开发功能的实现过程,抛砖引玉,给大家 提供编辑器二次开发的思路。 准备内容: 1、LayaAir IDE 项目中实际使用的编辑器版本为LayaAir IDE 2.0.0, 教程中使用的编辑器版本为LayaAir IDE 2.11.0beta1, 比较大的版本跨度验证了之后的开发方法没有版本问题需要注意。 2、sublime、vscode等可以全局快速查找内容的编辑器 打开Laya编辑器目录如下: .

lanuo的专栏 1115

LayaBox在使用removeSelf()方法移除场景的时候应该注意什么

程序入口存放每个ui界面的对象(这里有三个) // 程序入口 class GameMain{ public static mainUI:MainUI; //用于存放游戏主页ui的成员属性 public static secondUI:SecondUI; //保存第二页ui public static thirdUI:ThirdUI; ...

anquanxie2713的博客 976

iOS 删除项目中未使用的图片和类文件

由于随着项目不但的版本迭代开发,资源也不断的替换,执行文件 + 图片资源的也跟着不断的累积, 导致app的”容量“不断地增加。 为此我们需要给app瘦身,删除一些没有用到的类文件和图片资源。   1、删图 在进行删除没有用到的图片的时候,我想到了两种方法去实现它。 第一、使用工具 ; 第二、使用脚本删除。 使用工具:个人建议还是使用工具方法比较好。  不过小小的遗憾是 对于一些拼接的图片,工...

baidu_25743639的专栏 3893

Laya的资源加载

白鹭中的资源加载,可以单个去加载。但是更多是通过资源组加载的。 比如进入登录界面,则加载登录资源组的资源。销毁登录界面,则卸载登录模资源。 1 2 3 4 //加载登录模块资源组 RES.loadGroup("login"); //卸载登录模块资源组 RES.destroyRes("login");    那么Laya是怎么加载资源组呢? Laya.loader加载资源 Laya加载单个资源 .

xuniwawa010的专栏 2152

laya之坑--tiledmap编辑器

现在是2017年6月16号,一个超级大坑纠结了我一个星期,在这个星期内不停的在论坛上发帖问人.........................................................需要解决的问题很简单,tiledmap导出的json地图怎么都显示不出来,也不报错,最终还是自己从坑里面爬出来了 ---------------------------------------

u010345130的专栏 3444

Laya编辑器扩展 实现Spine可视化操作

mac地址 /Applications/LayaAirIDE_beta.app/Contents/Resources/app/out/vs/layaEditor/window 点击启动图标 右键菜单找到根目录后 /Resources/app/out/vs/layaEditor/可以看到 有SpineSkeletonPlayer类 但是未实现。

曾用名:极客柒 2381

用LayaAirIDE的TS语言编写一个简单的微信主域和开发域关联DEMO

一:在Laya中新建两个空项目 第一个当作主域 第二个当作开发域 二: 在第一个项目中写如下代码 1.在Laya.init前面加一句代码 Laya.MiniAdpter.init(true,false); 2.其他代码: //得到开发域 let open = window['wx'].getOpenDataContext(); //使用开发域传输数据cmd:6 ope...

qq_19240563的博客 707

Laya(三)-脚本使用

逻辑代码的编写方式: 1. 使用RunTime绑定对应场景或者节点 注意:组件的runtime逻辑类如果不继承组件自身,并且继承的对象中没有该组件的属性时,这个属性则会失效 2. 使用继承式页面类实现 两者的使用场景: 相比script脚本方式,继承式页面类,可以直接使用页面定义的属性(通过IDE内var属性定义),比如this.tipLbll,this.scoreLbl,具有代码提示效...

菜菜鸟的博客 4530
上一篇: 探究Laya关于TypeScript多个版本的编译问题
下一篇: JavaScript通过百度OCR实现图像文字识别及常见错误解释
Aertims
博客等级 码龄10年 109粉丝 66原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值