mipengine / mip2

MIP (移动网页加速器)通过优化网页JS、控制资源加载顺序,达到加速网页的效果。
https://www.mipengine.org/
MIT License
184 stars 49 forks source link

MIP 核心升级 Babel 版本至 v7 #537

Closed clark-t closed 5 years ago

clark-t commented 5 years ago

相关 ISSUE: (ISSUE 链接地址)

536

前置 PR: https://github.com/mipengine/mip-components-webpack-helpers/pull/1

1、升级点 (清晰准确的描述升级的功能点)

  1. 升级 babel 版本至 v7
  2. 调整 babel 配置,减少打包体积
  3. 调整 deps 引入模块

2、影响范围 (描述该需求上线会影响什么功能)

  1. 旧机型兼容性问题(iOS 8\9 Android 4.4)

3、自测 Checklist

4、需要覆盖的场景和 Case

5、自测机型和浏览器

coveralls commented 5 years ago

Pull Request Test Coverage Report for Build 1155


Files with Coverage Reduction New Missed Lines %
src/runtime.js 2 81.82%
<!-- Total: 2 -->
Totals Coverage Status
Change from base Build 1081: 0.1%
Covered Lines: 3852
Relevant Lines: 3991

💛 - Coveralls
clark-t commented 5 years ago

关于升级 Babel 至 v7 版本后导致 Travis CI 执行 mip-img 单测 'should replace src if load img error' 执行失败的排查说明

根本原因

导致问题发生的根本原因是:当前 Travis CI 的运行环境在执行 async/await 语法有问题,在表现上一个 try { await promise } catch (e) {/* 进入错误 */} 这样进入 catch 的过程需要消耗两个 microTask,在本地 Chrome 浏览器环境下运行实际上只需要一个 microTask。有点类似于:

promise.then(() => {}, error => {/* 出错 */})promise.then(() => {}).catch(error => {/* 出错 */}) 的区别。

单测现状

其次,我们的单测没有经过任何 Babel 处理,istanbul-instrumenter-loader 只是对代码做了覆盖率检测的逻辑插入,esModules: true 的配置项并不会对代码做任何 Babel 编译。因此在 Travis CI 执行的时候实际上是跑的包含 ES6/ES7 代码的例子,单测无法覆盖任何兼容性检测。

为什么线上版本(dev/master)的 Travis CI 能成功跑过单测

经排查发现是因为,dev 版的 polyfill 里面包含对 es7.promise.finally 的功能支持,从目前测试的情况来看,大概率是某段代码(浏览器原生 JS)里面会检测 Promise.prototype.finally 是否存在然后分别走了不同的逻辑,从而使得未升级 Babel 之前能够正常跑过单测。

本次升级 Babel 没有添加这个 finally 的 polyfill,因此 Travis CI 单测没过,后面补上之后就 OK 了。

结论

  1. 需要修改单测的 webpack 配置,增加 babel-loader;
  2. 这个问题只会在支持 ES7 的环境下才会触发,线上代码是经过 Babel 编译后才上线的,因此线上不会遇到这种问题。
  3. 酌情考虑在这次升级 Babel 的代码里增加 es7.promise.finally 的 polyfill,但好像不太需要。
liujing50 commented 5 years ago

测试内容:

  1. 小说阅读器重要回归功能
  2. top10站点
  3. 营销页面 兼容性测试: 旧机型兼容性问题(iOS 8/Android 4) 测试通过