sbfkcel / puerts_cli

开箱即用的 PuerTS 脚手架工具。
MIT License
40 stars 8 forks source link

请问如何确认hotload是否已经生效了 #2

Open wanghuatao opened 1 year ago

wanghuatao commented 1 year ago

puer dev --reload true 命令执行后,通过在 App.ts 的constructor里添加如下函数,并修改log,发现 editor没有输出新log setInterval(function () { console.log(FPS3:${Time.frameCount}); }, 1000);

sbfkcel commented 1 year ago

生效的(Node运行时),看Demo项目,修改注释中的部分。

wanghuatao commented 1 year ago

我的环境 win10,node 16.15.0,PuerTS_Nodejs_1.4.1 修改update方法内容还是不生效,只能实时编译

sbfkcel commented 1 year ago

看一下你的启动逻辑,有加载 developerTools 吗?

https://github.com/sbfkcel/puerts_cli/blob/main/Commands/init/Unity/Assets/CS/App.cs#L39 在这上一行打一条日志

wanghuatao commented 1 year ago

if(developerTools != string.Empty){
Debug.Log("ExecuteModule developerTools "); // 启用 SourceMap 映射 vm.ExecuteModule(developerTools); };

log有正常打印

sbfkcel commented 1 year ago
# 使用where找到你的puer安装目录
where puer

# 在输出的目录下找下 `lib/createDebugers.js` 69 行 开始的方法中添加日志,修改为下面的参考片段。看进行到哪里了(https://github.com/sbfkcel/puerts_cli/blob/main/lib/createDebugers.js#L69)
    async update(filePath){
        console.log("1 进到更新方法中来了",filePath);
        if(!this.debuger){return;}
        const scriptSource = fs.readFileSync(filePath,'utf-8');
        console.log("2 读取到了文件",scriptSource);
        const scriptId = this.pathMap.get(createHash(filePath));
        console.log("3 拿到模块ID",scriptId);
        if(scriptId === undefined){return;};
        const isExist = await this.debuger.getScriptSource({scriptId});
        console.log("4 模块存在",isExist);
        if(!isExist || isExist.scriptSource === scriptSource){return;};                             // 代码一样则不需要处理
        const res = await this.debuger.setScriptSource({scriptId,scriptSource});                    // 重载
        console.log("5 代码与之前不一样,执行完重载");
        console.log(`${lang('overload')}${filePath}`);
    }
wanghuatao commented 1 year ago

3 拿到模块ID undefined
走到这里

sbfkcel commented 1 year ago

在下面一行把 createHash(filePath)、filePath 都打印一下呢?

wanghuatao commented 1 year ago

在init方法里面 console.log('写入文件信息',scriptId,filePath,params.url);打印信息如下: 写入文件信息 155 27b704a87689e8f5acbc06f514deb89d G:/svn/TestPuerTs/Assets/Resources/JS/App.js 但是在update方法里面: console.log("3 拿到模块ID",scriptId,createHash(filePath),filePath);打印信息如下: 3 拿到模块ID undefined 1d88aed68f03ecda690fe152a5492f93 G:\svn\TestPuerTs\Assets\Resources\JS\App.js.

两个地方产生的hash不一样,应该是 分隔符 / \ 造成的

在update方法第一行加上 filePath = filePath.replace(/\/g,'/'); 现在可以hotreload了

sbfkcel commented 1 year ago

应该是windows路径造成的。晚点儿我修复一下