记一次Vue3.3.3 p5-urgent级 bug修复过程

起因

因为项目需要使用Vue3的新特性,所以我们决定升级Vue的依赖版本。然而,在刚启动项目后,上来直接遇到了一个报错导致了启动白屏。首先,我们排查了可能是由兼容性问题引起的,但经过一番操作后,发现问题并不是由此引起的。于是,我们决定去GitHub的Issue页面搜索一下,看看是否有其他人也遇到了类似的问题。

定位问题

果然,通过搜索,我们很快就在Vue.js的GitHub仓库上找到了对应的Issue:Error in v3.3.3 · Issue #8353

看了一眼这个bug,很多人都能够复现这个bug,并且影响范围非常广泛,这让我立马就来了兴致,想看看是什么原因引起的。毕竟以前从来没有遇到过vue发生这么严重的问题。

通过浏览器打印的堆栈信息,很快就定位到了报错的地方,编译后的结果在track函数后少了一个分号,导致函数调用的中间有两组括号。在正常情况下,函数调用应该只有一个括号对,用于传递参数。

修复过程

接着,我打开了WebStorm,定位到了编译前的代码,从代码写法上来看,找不到任何问题,所以判断问题似乎是由编译后的代码引起的,我想到了一个可能的解决方案:修改__DEV__的写法,以便正确打包出代码并解决这个问题。

通过将 __DEV__ && markAttrsAccessed() 改为 if (__DEV__) { markAttrsAccessed() },成功地解决了在Vue 3.3.3版本中出现的编译后问题。这样的修改确保了在开发环境下执行 markAttrsAccessed() 函数,而在生产环境中则不执行,避免了问题。

于是我决定提交一个PR:fix(compiler-sfc): missing semicolon in track function causing runtime error in production (#8353) by kirklin · Pull Request #8358 · vuejs/core (github.com)

更好的解决方案

大约一个小时后,尤雨溪给了一个更好的解决方案: 在rollup.config.js中对__DEV__: (process.env.NODE_ENV !== 'production')进行修改为__DEV__: !!(process.env.NODE_ENV !== 'production'),这是一个小但重要的修改。添加双重感叹号(!!)确保__DEV__标志始终是布尔值(truefalse)。这个修改有助于保持一致性,避免与__DEV__标志的真值性相关的任何潜在问题。

大佬就是大佬,这才是真的从编译上解决了问题!!

相关推荐
yyt3630458416 分钟前
一次鼠标交互触发两次 Vue flushJobs:把高频交互从 VDOM 里拆出来
前端·vue.js·计算机外设
YUJIANYUE13 分钟前
查立得万用查分安卓版(web环境+查询系统免安装单文件一键运行包)
android·前端
知兀28 分钟前
框架脚手架搭建,推送github一键使用
javascript·vue.js·ecmascript
慧都小项43 分钟前
从 Figma 到 Qt:Qtitan 能减少哪些界面还原工作?
前端·qt·嵌入式·figma·图形界面·工业界面·qtitan
YWL1 小时前
OpenLayers导出功能:地图截图+GeoJSON导出完整方案,从Canvas合并到PDF生成
前端·vue·openlayers
苦瓜小生1 小时前
【前端】【力扣与手撕】十天带你刷完前端算法与手撕,全是最简单好记的最优解法!day4
前端·数据结构·算法·leetcode·面试
mayaairi1 小时前
Vue2 实战进阶:表单数据收集、指令系统与自定义指令全解析
前端·javascript·vue.js
计算机魔术师1 小时前
实测GPT-6 Astra后,我发现过去十年的专业门槛正在失效
前端
虎头金猫1 小时前
Pic Smaller 本地部署:压缩图片、转换格式,再搭建自己的 Web 工具
运维·前端·开源·aigc·ai编程·ai写作
hunterandroid1 小时前
Android ANR 排查实战:从线上告警到主线程卡点定位
android·前端