记录package-lock.json错误的debugger过程

130 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

问题

项目A是跑在一个端内webview容器里面的,在内网发布了一个修复版本之后,页面上部分内容渲染不出来,接口数据正常返回,页面也无任何报错。

排查

1. 确认是否是运行环境(客户端)的问题

切换前端不同环境:本地开发、内网、预发布和外网,发现只有内网异常,其他环境均正常。至此排除运行环境的可能性。

2. 确认源码是否有问题

a. 先把内网分支代码拉到本地,开启本地调试,发现正常运行,无报错;

b. 在内网开启sourceMapconsole.log模式,观察每一步流程的日志输出,并尝试断点,无报错异常。因为无异常,发现sourceMap断点也无从下手,不知道该从哪一步开始断点;

c. 干掉内网分支,重新从外网prod分支拉取一个内网分支并发布,同样跑不通;

综上可确认,源码无问题!

3. 确认是否是构建系统的问题

a. 内网分支(eg: rc-v1.1.1-dev)构建发布之后内网访问异常,预发布环境在此刻是正常访问的;决定从预发布分支(eg: rc-v1.1.1-pre)拉取一个新的预发布分支(rc-v1.1.2-pre)并构建发布1.1.2版本的预发布环境,发现新的预发布环境访问异常,跟内网是同样的问题;

b. 将内网分支在本地build一遍,并通过一个本地的http server(使用npm安装一个http-server即可)访问构建后的应用,发现加载正常!

到这里基本可以确认是构建系统产出的文件存在问题,并且我们意识到这是一个必然事件,只要有新提交触发构建并发布,页面就会崩,活脱的一个定时炸弹!

4. 排查有构建产出的问题文件

我们的问题是局部的数据内容没有被渲染出来,说明应该是部分bundle文件存在问题。

a. 我们把内网的bundle资源下载下来,逐个替换本地http serverbundle文件,最终发现替换到vendor文件的时候,本地也复现了内网的问题;

b. 我们对比了下本地和内网这两个vendor文件有什么差异,发现所依赖的一些第三方模块的版本不一致,其中就有vue.js(v2.6.12 vs v2.6.13

c. 是我们Jenkins构建机安装的项目依赖版本不一致引起的。

解决

package.json文件是被托管的,在各环境下都相同,但package-lock.json文件我们没有托管,而我们每次构建都是依赖lock文件指定的版本的。lock文件的作用可参考package-lock.json文件

快速解决的方案是,把本地的lock文件托管上去,覆盖Jenkins服务器上的lock文件,按照相同的版本依赖进行构建。然后,问题解决了!

至于为何升级了vue.js的版本会引起无法渲染,这个原因未能找到,实在是无任何错误信息[跌倒]。

结语

至于lock文件为何没有被托管到项目,我觉得主要有两个原因:

  1. 历史因素,项目最初就没托管这份文件,并且一直未出现过问题;

  2. 对于lock文件的作用意识不够深入,没踩到坑就不知道疼。

anyway,排查的结果不重要,重要的是排查思路!