[编辑器] [BUG] 自定义扩展: asset-handlers 没有执行

版本: 3.5.0
OS: macOS 12.3.1

通过 编辑器 > 扩展 > 创建扩展 生成的示例代码, 编译-加载-启用后, builder.js / hooks.js 都执行了, 唯独 asset-handlers.js 无论如何也不执行.

是否因为官方加了个 ‘自定义压缩方式‘ 这个试验功能, 把原来 compressTextures API 忽略了?

中午鬼使神差, 不知道为啥终于执行 asset-handlers 了.

结果, 现在又只执行旧代码 不管是重编译, 清缓存, 重加载都无效 !!

到底是什么逻辑哦…

不执行具体是指哪个方法不执行?这个:compressTextures?

当然是指这个文件没有被导入执行了(比如顶层 console.log 没输出) .

不过重启编辑器 + Dashboard 似乎能加载了(刷新扩展没用, 每改一行都要这样). 更多的问题却在后面,

  • 删除一个扩展后, 构建仍会继续运行缓存的扩展代码 (清理和重启也无效, 后来才发现, 必须重新创建一个构建配置) .

  • 文件 useCompressTexture 参数不够灵活, 比如要用 pngquant, 光一个 10-100 的数字不足以描述需求.

  • 默认模板 (项目>新建构建扩展包) 逻辑有缺陷:

export const compressTextures: AssetHandlers.compressTextures = async (tasks) => {
    // ?? 沿用模版的代码, 总是有些文件被跳过 猛然发现竟然是这样写的!
    for (let i = 0; i < Array.from(tasks).length; i++) {
        const task = Array.from(tasks)[i];  
      //...

     tasks.splice(i, 1);
  }

这个我这边测试是正常的,如果有压缩纹理缓存,没触发重新压缩的情况下是不会触发的;

这个是指的刷新插件?如果是的话,在插件代码重新生成后,可以在构建调试面板 ctrl+r 进行刷新;

这个没复现。

比如?是指有怎样的问题?

我相信你能在日志中能找到已删除的扩展名字…

下面不是放了代码么.
经典边迭代边删除元素, 导致部分元素被跳过.

const tasks = [1,2,3,4]; //example
// 这2个 Array.from 应该是替换变量失误了吧
for (let i = 0; i < Array.from(tasks).length; i++) {
        const task = Array.from(tasks)[i]; 
        console.log(task);
       tasks.splice(i, 1);
}
> 1,3

之前我就到问题是插件脚本 require 的文件不会随着重启Creator而释放,

// test.js
let ToolsApi= require('ToolsApi.js') 


// 测试Dome
// test.js 重启Creator后
// 重启Creator或从商店下载该插件更新后,ToolsApi 脚本缓存仍然没清除
// 导致就算修改了 ToolsApi 脚本内容,require函数仍然导入的是旧对象
let tempToolsApi == require.cache['ToolsApi.js']


let ToolsApi= require('ToolsApi.js') 
if(tempToolsApi == ToolsApi) {}// 同个对象

现在我插件每次启动前都要调用这方法清除所以脚本缓存,防止更新出错。既然有人也遇到这问题我再提一次反馈

// 临时解决方法,插件入口调用该函数清除缓存
function clearRequireCache(){
	if(require.cache){
		// console.log("清除脚本缓存")
		for (const key in require.cache) {
			if(key.includes('插件包名') ){
				delete require.cache[key];
			}
		}
	}
}

这个只是你编程基础没学好导致的问题

Excuse me?
这不是我的代码… 这是 “构建扩展模板” 的代码, 我在这反馈问题呢.

好吧,抱歉,那就是写出这代码的是菜鸟

可以看下这里 https://forum.cocos.org/t/topic/134526/5?u=shengyudu