这篇文章所叙述的并不是一个牛逼程序员,在遇到难题后怎么一步步排除万难,通过一连串骚操作然后完美解决问题,并在事后跟别人说起时,洋洋得意地带上一句“这个很简单啊”。如果大家希望故事结局是这样的,那么可以不浪费时间直接跳过阅读了。相反,笔者折腾到最后默默放弃了,这究竟是一场多痛的领悟,容我慢慢道来。

事情缘由

上个月有个issue #137提到Tiny RDM在Mac10.15下运行是白屏,恰巧年关将至忙活各种事情,又一时半会找不到这么老的系统,所以就搁置了。适逢最近微信群里有小伙伴用10.15尝试编译运行Tiny RDM,也是遇到一模一样的白屏问题,并验证了新建的Wails空项目是不会白屏的 。这么一说,原本以为是Wails的兼容性问题,现在看起来更像是我代码的问题,那我就有点坐不住了,刚好1.1.9版本也快赶完了,于是我决定要亲自查下究竟是啥问题。

翻出古董Macbook Air

当天回家,我翻出了很长时间没开过机的2013款MacBook Air,这在当年可是斥巨资定制的(配置是i7/8G/256)。如今电池早已坏掉,需要一直插着电源才能使用 ,所幸还是可以正常开机的。开机后发现系统早已被我升级到Big Sur了,于是又是经过一顿操作后依次下载镜像、制作U盘引导、重装系统,然后是安装运行环境和各种所需软件。

macbook_air.png

不得不吐槽,这个古董真的已经慢到无法忍受了,做到让项目能正常编译这一步,就浪费了我两个晚上。Tiny RDM运行起来后,看到了意料之中的白屏,接下来要开始看看具体原因了。

找出白屏原因

打开web控制台,有一个比较显眼的报错,点开调用栈堆一看,基本确认是由Monaco Editor引发的。
monaco-editor报错.png

为了完全确认这个白屏问题就是Monaco Editor导致的,我又在项目的前端代码中直接执行npm uninstall monaco-editor完全移除掉这个依赖,屏蔽掉和这个依赖相关的代码。软件界面终于出现了,不过整体效果依旧让我傻眼,一堆的报错和界面错位。
界面报错.png

还是先看看Monaco Editor的兼容性问题还有没有得救。我首先下意识用Safari打开了vscode.dev,果不其然也是一片空白。看来官方也放弃支持10.15了?此时我也还没死心,二话不说我先用上了网络搜索大法。

查找解决方案

在Monaco Editor官方网页上,我惊喜发现自带浏览器Safari是能正常显示的,并且官方仓库有个issue#2432也讨论过这个问题:就是有人反馈官方的网页在Safari13.x上也是空白,然后下面还有好几条代码提交是修复这个问题的。大概原因是这个版本的Safari不支持addEventListener,所以使用了即将弃用的addListener来代替,这和我上面从调用栈堆里面翻到的报错一致。只是这时又冒出了另一个问题,为什么官方网页能在Safari上显示,而Tiny RDM却不行,它们使用的都是最新0.46.0版本。

带着这个疑问,我在浏览器上打开Tiny RDM调试模式下的Web版本,它居然没有白屏,并且上面软件截图的错位和报错统统不存在!这说明了mac 10.15的Webview2和Safari上所使用的居然不是同一个浏览器内核,这又是另一个大坑。然后我在其他issue#2457上看到了有人反馈WKWebView<=10.15没法正常加载的问题,下面官方回复则坚决认为issue#2432中的修改已经处理这个问题了,然后就再也没有然后了,也就是官方并不打算再继续处理了。
issue_2457.png

填坑or弃坑

如果是以往遇到这样的问题,我可能会尝试以下的方案:

  1. Monaco Editor退回到兼容的0.22.0版本(当前0.46.0)。
  2. 开始翻Monaco Editor源码,替换addEventListener之类不兼容的代码看是否能让其正常工作。
  3. 将Monaco Editor更换成Code Mirror或者其他同类插件测试下兼容效果。

其中第一条我已经试过了,版本跨度太大,缺少了一些现在在用的功能,而且还会有很多陈年老BUG在。后面两条随便一个都需耗费不少精力,而且最后能不能真正解决这个问题并且不带来新问题还是未知数。

如果是以前我肯定不眠不休开始进行第二和第三条极端方案了(相信很多程序员和我一样有强迫症,不会取舍,遇到问题上就完事了),但是经过周末剩余时间的思考和挣扎后,我决定不填这个坑,没错,我放弃处理这个问题了

事后感悟

上面所叙述的过程看起来轻描淡写,却是花费了我两个晚上外加半个周末。思来想去我放弃的原因大致如下:

  1. Tiny RDM整体基于Webview2,用的都是比较新的东西,面向的也是喜欢尝新的用户群体,对旧系统的兼容性不好是意料之中的。一个人的精力有限,不可能凭一己之力做到十全十美,兼容市面所有的桌面系统。
  2. 这是个开源项目,我解决不了的问题,肯定有更厉害的人动动手指就能解决,或者有过来人已经经历过,留给更专业的人展现能力,充分发挥开源社区的魅力。
  3. 独立开发者不应该只顾着埋头写代码和修BUG。做这个项目有更多目的还是尝试推广和获客,写代码并不是全部。空出时间来尝试更多重要的事情:提高现有正常功能的稳定性,完善官网和使用文档,编写推广文章,学习演示视频创作等等等。以后做商业产品也应该如此,切忌在细节上花大量时间只是换来“自我感动”。

敢于取舍也是一种成长。