一次在ci打包编译vue项目,上线到测试环境后出现了Maximum call stack size exceeded error错误。

这个错误意思是堆栈溢出。本地环境无任何这样的问题,但经过ci跑完之后就出现这个问题。 错误提示指向了打包后的js文件,由于代码压缩uglifyjs,所以直接是看不到错误根源的。在搜索了相关的资料后,有提到是vue单页面组件中存在重复定义的变量。但我有引用lint工具,如果出现这样但情况git提交是无法顺利进行的。

切换部署代码

把部署到测试环境的代码回退到上一个tag,意在排除是代码的问题。结果回退到上一个tag后,经过ci部署,线上仍旧出现这个情况。

经过一步步推测,觉得就是在打包编译的过程中出现了问题。

问题原因

在ci到log日志中,发现代码在build的过程中,prettier出现了不少的错误。所以根源就在于本地和docker镜像中的项目build所需要的某个package出现异常。 而异常就应该出现在prettier上。

问题处理

要是出自某个package上,只能是package的版本不一致导致的。在package.json中,看到版本:

"prettier": "^2.0.2"

这个版本符号”^”是插入符号,这会安装当前的主要版本,例如上面的版本的话,会更新到2.x.x最新的版本。这就会可能引起版本的不一致。

把这个符号移除掉,固定版本号之后,ci也不会出现问题,上线就恢复正常了。

package.json版本总结

package.json中的版本号有3个位。例如:1.12.2

从左到右,第一个数字为主版本号(marjor version),第二个数字为次版本号(minor version),第三个数字为补丁版本号(patch version)。

~: 更新中间数字的最新版本。如~1.3.1会更新1.3.x最新版本。 ^: 更新第一个数字但最新版本。如^1.3.1会更新1.x.x最新版本。