持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
问题
项目A是跑在一个端内webview
容器里面的,在内网发布了一个修复版本之后,页面上部分内容渲染不出来,接口数据正常返回,页面也无任何报错。
排查
1. 确认是否是运行环境(客户端)的问题
切换前端不同环境:本地开发、内网、预发布和外网,发现只有内网异常,其他环境均正常。至此排除运行环境的可能性。
2. 确认源码是否有问题
a. 先把内网分支代码拉到本地,开启本地调试,发现正常运行,无报错;
b. 在内网开启sourceMap
和console.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 server
的bundle
文件,最终发现替换到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文件为何没有被托管到项目,我觉得主要有两个原因:
-
历史因素,项目最初就没托管这份文件,并且一直未出现过问题;
-
对于lock文件的作用意识不够深入,没踩到坑就不知道疼。
anyway,排查的结果不重要,重要的是排查思路!