记一次Maximum call stack size exceeded error
一次在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最新版本。