1 问题描述

刚到公司,测试突然提个紧急 bug 过来,说 release1 的加载动画不动了,一直卡着,如图:

2 调试过程

2.1 了解情况

  • 与浏览器无关,多次重启均可以复现,非偶发现象
  • 前端无相关报错
  • 代码启动2 正常,jar 包启动有问题

初步判定,跟打包过程有关。jar 包里肯定有什么问题。

2.2 进入调试状态

  1. 在浏览器中预览一张模版3,在一堆 js 代码中,找到加载动画相关的代码,打断点。
  2. 开启 debug 模式,停在加载动画出现的时候。
  3. 选中表示加载动画的 div,查看 CSS 样式

2.3 细节对比

代码启动,也进入调试状态,查看 CSS 样式。对比两者的差异。 div 的样式本身没什么区别,唯一的区别是 keyframes 定义的动画帧。 keyframes 的定义如下:

@keyframes loading-stretchdelay { 0%, 40%, 100% { transform: scale(0.2, 0.2); } 20% { transform: scale(1.0, 1.0); } }

jar 包启动时,浏览器观察到的结果如下: 丢帧了。 如果在浏览器中修改 scale 的参数,发现加载动画开始动了。 现在的问题是,为啥 jar 包启动,会丢帧?去 jar 包里看看究竟。

2.4 CSS 文件对比

首先,用反编译软件(这里使用 Luyten)打开 jar 包,找到 css 文件,如图所示: 没看出啥问题。 把这个压缩后的 CSS 拿去替换代码中 CSS,然后用代码启动报表,复现问题了!加载动画成功卡住不动。说明问题就在这段 CSS 中。 发现一个奇怪的现象:jar 包中的 CSS,IDEA 会提示语法错误;原来的 CSS,则没有提示。对 CSS 进行了一番简化,结果让我吃惊: 上面、下面都是原来代码中的 CSS,中间的是 jar 包中的 CSS。唯独中间这段,提示语法错误。

2.4 进一步对比

怀疑中间这段代码有特殊字符,IDEA 中未显示。用 VI、Atom 都打开看了下,没看到,这三段代码明明毫无区别! 不过事实摆在面前,还是得相信 IDEA 的提示。 逐步缩减对比的代码,终于发现原因: 竟然是小小的 %。打包的时候,0% 变成了 0。这,真是万万没想到……

2.5 解决方案

到公司打包群里讨论这个问题,发现近期更换了打包压缩的工具,用了 yuicompressor-2.4.8 版本。很可能是这个原因。接下来需要负责打包的同学去排查、修复了。 bug 退回给测试。


  1. Git 工作流,feature/release/final/master 分支,在 feature 上开发新功能,在 release 上修复各种 bug,在 final 上跑冒烟测试,master 是正式发布版本。几乎每天都会在服务器上生成各个分支的 jar 包,方便测试和产品试用。
  2. 直接在 idea 中启动 FineReport
  3. 即打开一个包含加载动画的页面