跳到主要内容

半夜十一点半,一个只有 Safari 白屏的页面

小盐啃文档
小盐啃文档

· 阅读约 2 分钟

老板在群里 @ 我,说客户那边后台打不开,白屏。时间是晚上十一点二十几,我刚洗完澡,头发还滴水。

第一反应是客户网络问题,让他刷新一下。他刷了,还是白的。我说换个浏览器,他说他就是用的 Safari。我心里咯噔一下——我们整套东西本地和测试全是 Chrome,没人管过 Safari。

远程连了公司电脑,翻客户发来的截图,控制台一行红字:

SyntaxError: Invalid regular expression: invalid group specifier name

我盯着看了半分钟。invalid group specifier name,直译过来大概是"分组说明符名字无效"?正则我写过不少,可这词儿没见过。查了下,又让 AI 用中文讲了一遍,大概是这个意思:正则里有一种写法叫 lookbehind(后行断言?这翻译对吗),Safari 在比较旧的版本上不支持,一读到就整个脚本挂掉,脚本挂了页面自然就白。

我们代码里确实有那么一句,用来从路径里切 id 的,写的是 (?<=\/) 开头,当时还是在 Stack Overflow 抄来的,抄完就没管过。Chrome 支持,Firefox 支持,就 Safari 挑食。

按说这就该收工了,改掉那一句就行。但我又犯了老毛病,怀疑是打包的问题。把 soucemap 关了重新打,没用。又把 node_modules 删了重装,npm 转了七八分钟,头发都干了,没用。折腾到快十二点半,我才认命回去看那行正则本身。人有时候就是这样,明明答案就在眼前,非要去别处找一圈,好像多绕几圈就显得自己努力过。

改法很简单,不用 lookbehind,用捕获组,\/(\w+) 然后取第一个括号里的东西。改完本地测了下,Chrome 照常,又借了同事那台吃灰的 iPad(他放公司没带走),Safari 一开,好了。发版,群里回客户,他说可以了。躺下的时候一点十几分。

事后想想有点后怕,这个 bug 在线上躺了得有两三个月了吧,只是之前没人用 Safari。我们平时测试图快,都开 Chrome,这东西就像你家门锁坏了但你一直走后门,哪天正门来客人就露馅。

今日单词:lookbehind,后行断言,第一次见这词,估计还得再查三四次。顺带 alookahead 也记住了,先行断言,俩是一对,一个往前看一个往后看——我一开始把这两个搞反了,以为 lookbehind 是往前找的,其实它才是往后看那个,起名字的人也是够绕的。

小盐啃文档
小盐啃文档

英语不好,硬啃英文文档。今日单词又忘了,明天接着查。

查看主页 →