记录一点写模拟器时遇到的各种神坑。虽然有几个东西坑太大了跳不过去只能放弃。

1. [Vue warn]: You may have an infinite update loop in a component render function

天坑,没有之一。
console 里直接报错:

1
[Vue warn]: You may have an infinite update loop in a component render function

咕狗了一圈感觉都讲得不清不楚,什么 v-for 时改了 vm.$data 之类的啊……
最后写完了想了半天终于想通了,大概是:一个对象 A 交给 Vue 跑 v-for,过程中由于各种因素,产生了对对象 A 内容的更改(我的例子是对象 A 有个方法,调用来返回数据,这其中 会对 A 的内容产生更改 (虽然调用完后的结果是相同的),这种操作会导致 v-forVue 检测到对象更改重新渲染(这里又调用一次更改 A 的方法) → v-forVue 检测到对象更改loop...
避免方法大概就是不要把会更改自身内容的方法写进 v-for 里面去。然而一改就要改好多地方,最后弃疗了。

天坑。

2. 复制对象后,对源对象的修改影响到复制的对象

说人话就是“ a = b,然而改了 b 之后 a 也跟着改了”。
咕狗了半天,大概是 浅拷贝深拷贝 的区别。
大概可以用符号链接来描述吧。普通 a = b 相当于 a 只是 b 的一个符号链接,并不是完全的复制。
要复制的话大概需要用 Object.assgin() 这个方法。
然而这个方法是 ES6 的,IE 全家都没法用,又一个天坑。
解决方法是直接引进 polyfill 这个 js 库,作用是让那些上古时代的产物支持 ES6 语法,可以说是模拟器?

另外,通过一个很好很强大的 polyfill service 还能自动检测当前浏览器,以决定加载 polyfill 的内容。对那些使用现代浏览器的用户来说实在是福音,不用因为照顾上古浏览器而拖累性能了(现代浏览器加载 polyfill 的话也会拖累的吧?)。
直接调用 JS 即可。

1
https://cdn.polyfill.io/v2/polyfill.js

3. (13)Permission denied: exec of … failed

CGI 需要具有执行权限。如 rwxr-xr-x (755)。
chmod 一下即可。

4. (8)Exec format error … (同上)

Notepad++ 傻逼!!!!!
Notepad++ 傻逼!!!!!
Notepad++ 傻逼!!!!!

除了没在 CGI 脚本开头加 #!/usr/bin/<解析器名称> 之类的这种破事之外,剩下的就是某些 奇怪的 文本编辑器莫名在脚本开头 加了奇怪的东西
网上的说法是文件头前 3 字节加了奇怪的东西进去,反正这种东西没人知道的啦。

解法:用专用于写代码的文本编辑器(比如 VSCode)新建一个文件,把原来文件的内容复制过来保存。或者直接 vim 然后整个粘贴。

之前有说法是什么换行符(CRLF、LF)的问题,不过我是用 git 自动部署的,git 会自动帮我转换换行符。
最后焦点就落在了 Notepad++ 上面。用这货写的 Python 无一例外全部报错了。发现直接全文复制,ssh vim 粘贴就好了。
不是我不想用 VSCode 写啊!!!4G 内存开个 Webstorm 加 Chrome 已经要死了,再开个 VSCode 就不用活了好嘛!!(推荐 PyCharm 的请立即去跳楼)
哦对了,ReadyBoost 好像还是有点用的。能不能把我的 32G 三棒卡写坏啊,我的 chromebook 不认这卡想换一张

5. malformed header from script ‘blabla’ : Bad header: blabla

又一个上古巨坑(巨坑真廉价)
header 错误大概就是 CGI 脚本返回前要指定格式,比如 Content-Type: application/json 之类的,另外好像还要输出两行换行。
问题是我确确实实这么做了:

1
2
3
4
5
def sentJSON():
print("Content-Type: application/json")
print("\n")
print("\n")
print(json.dumps(resultJSON,indent=1))

于是我被折腾了一个小时,其间还想过是不是 Apache 的 Bug(我有好好学习提问的智慧),因为我用 Python 自带的 http.server 毛事没有。

最后在文件里发现了这么一行

1
print (readId)

??????
结论:在调用 sentJSON 回传之前就已经 print 了一个 readId 出去了,导致直接报错。
(这样的结果是头部先是 readId 然后才是 Content-Type)
所以千万不要 XJB print 啊,虽然对 debug 很有帮助,但万一留下一个 debug 用的没删掉影响到正常使用就好笑了。
纪念我的一小时(我还打算 debug 完了就去睡觉的)

6. Safari 没法打开 Bootstrap 的 Modal

好像据说是 Safari(反正我是 Safari Mobile powered by iOS 10)不认 <a> 以外的点击事件之类的?
虽然可以用 jQuery 解决,不过这未免太不优雅(一边用着 jQuery)。
StackOverflow 上有一个非常暴力的解法是这样的:

1
2
3
body > *{
cursor: pointer;
}

这未免太过暴力了,于是我稍微改了一下:

1
2
3
#specific-btn {
cursor: pointer;
}

虽然正规的解决方案是把要点击的元素做成标准的 <a> 或者 <button> 就是了。

7. (0 >= null && 0 <= null) // true

谁设计的 JavaScript ……