记录一下cocoscreator打包后,在微信开发者工具和真机调试中的坑

背景

最近在用cocoscreator做一个对战的小游戏,通信用的socket.io模块,客户端语言用的ts,后端用的node.js
简单的功能做的差不多了,然后打包到微信开发者工具和真机进行调试时发现了一些匪夷所思的问题(也许只是对我来说是这样)。记录一下,以避免以后踩同样的坑。

一、self in not defined

在这里插入图片描述
在本地和开发者工具中调试都是正常的,但是不知为什么到真机调试的时候就会报这样的一个错。
国庆前,就一直搞这个问题,cocos论坛和微信开发社区,大佬群各种地方发帖子,寻求解决办法。最终,无疾而终。

终于在国庆之后,死马当活马医。在我全局搜索项目中哪里用到了self之后,发现socket.io.js里边有几个self。代码是压缩状态,我也没仔细看里边的逻辑是怎样的,猜测有可能是这里边self有问题吧。
反正已经试了很多方法了,也不差这一下,换个socket包试一下吧。

于是,我把socket.io.js(客户端用)的版本改为之前在论坛找到的一个包,版本1.4.4。

最终测试,竟然成功了,困扰我半个月之久的问题终于解决了。

总结:
1.用1.4.4版本的socket.io.js客户端包
2.执行命令 npm install @types/socket.io-client 得到的1.4.5的ts声明文件(ts智能提示需要)

疑问:socket.io包的版本是:^2.2.0,socket.io.js也是从这里边拿出来的,版本相同按理说应该是没问题的,为什么这儿却不行。

如果你也需要使用 ts的.d.ts + socket.io.js ,我打了一个包,可以下载
ts+socket.io
没有积分的,可以留言邮箱,我给你发。

二、json对象的循环引用

Converting circular structure to JSON;at setTimeout callback function
TypeError: Converting circular structure to JSON
at JSON.stringify ()
在这里插入图片描述
看问题是在onLoad的时候,JSON.stringify 方法报的错,
原代码里,我做了一个判断,

//window.global不存在时,则初始化
if (window.global == null || JSON.stringify(window.global) == '{}'){
		window.global = {};
}

因为此时window.global是undefined,所以导致了JSON.stringify出错。
把这句改为 if(!window.global) 就可以了。

三、cannot set property ‘’ of undefined

在这里插入图片描述
PS:按理说,这种问题很简单,就和java的空指针类似,肯定是哪个变量没有定义才导致的。顺着这个思路走下去。

看错误提示,是addPlayer方法里边出的错,经排查发现是取global的一个属性时,这个属性还未定义。
因此,在入口程序的脚本里边把所有用到的全局变量都初始化一下。
类似于这样的:window.global = { a:null, b:{}, c:[] };

然而,重新测试还是这样的问题,百思不得其解,我已经初始化了,为什么还是找不到变量。于是,我在微信开发者工具里进行断点调试。

这里无奈吐槽一下,我简直要被微信开发者工具的debug工具误导死了,还以为是json解析异常呢。让我走了很多弯路。

首先说明一下,下边的data是从服务器接收的一个嵌套的对象,结构类似于

{
	players:{
		aaa: {
			name: "zhangsan",
			age: 12
		},
		bbb: {
			name: "lisi",
			age: 13
		}
	}
}

看debug步骤:
step1: 此处data值显示正常
在这里插入图片描述
step2: data.players显示的值也正常
在这里插入图片描述
step3: 发现let players = data.players这一行赋值语句,赋值后的players为一个字符串
在这里插入图片描述
这就很奇怪了,players本来应该是一个对象的,为什么在这却变成了一个字符串呢?

此处略过我的各种猜测,又改服务器代码,又该客户端代码的。(内心MMP)

虽然看着这语法没有什么不对的地方,但是我一时半会怎么也想不通到底结果为什么是这样。但是我不信邪,我就不信了,这么个小问题我还搞不定你了。

最终,我在控制台打印了一下global变量的时候,发现了重要的问题所在,此时global定义的空对象{}和空数组[]竟然全是undefined未定义的。明明,我已经在游戏开始场景定义了啊。算了,那我在本场景再重新定义一下吧。

终于,一番操作之后,问题被解决了。控制台也能正常的打印出来global空数组和空对象。此时再去看我debug的变量let players = data.players,players竟然显示正常了,WHAT???
微信,你玩我呢是吧。真是把我害惨了好吗。为什么同样的代码,刚才显示异常,现在显示又正常了呢??完美的把我的注意点带偏了。

总结:这个问题,导致的原因,是跨场景时global定义的空对象和空数组不识别,需要重新定义。
也引出了另外一个问题,global已经是全局的变量了,为什么里边的空对象和空数组在初始场景定义了,进入到其他场景却还是undefined呢?(global里边定义的null可以正常的跨场景)这个问题,容我以后再研究,有知道的小伙伴可以留言告诉我,谢谢~

发布了43 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_26542493/article/details/102533480
今日推荐