7.12.0 • Published 2 years ago
@head/preset-babel v7.12.0
@head/preset-babel
// babel.config.js
module.exports = {
presets: [
['@babel/preset-env', {
exclude: [
'@babel/plugin-proposal-class-properties',
'@babel/plugin-proposal-private-methods',
'@babel/plugin-proposal-logical-assignment-operators',
'@babel/plugin-proposal-numeric-separator',
'@babel/plugin-proposal-unicode-property-regex',
'@babel/plugin-transform-dotall-regex',
'@babel/plugin-transform-unicode-regex',
// '@babel/plugin-syntax-top-level-await',
],
}]
],
}
7.12.17 2021-02-18
- @babel/core @7.12.17
- @babel/plugin-transform-runtime @7.12.17
- @babel/runtime @7.12.18
- @babel/template @7.12.13
- @babel/generator @7.12.17
- @babel/preset-env @7.12.17
- core-js @3.8.3 2021-10-13
- core-js-compat @3.8.3
- browserslist 4.17.6 2021-11-03
已通过 finished proposal,但在我们锁版本的当时并没有,所以不建议使用:
- @babel/plugin-proposal-class-properties ES2022
- @babel/plugin-syntax-top-level-await ES2022
- @babel/plugin-proposal-logical-assignment-operators ES2021
- @babel/plugin-proposal-numeric-separator ES2021
已通过 finished proposal,但不是良好的工程实践,所以不建议使用:
- @babel/plugin-proposal-unicode-property-regex
- @babel/plugin-transform-dotall-regex
- @babel/plugin-transform-unicode-regex
没有通过 finished proposal,不应该使用:
一些 @babel/plugin-syntax-x 已经升级到 @babel/plugin-transform-x,但依赖并没有改好。
browserslist
- 2011-06,ECMAScript 5.1 版发布,并且成为 ISO 国际标准(ISO/IEC 16262:2011)。
- 2015-06 发布 ES2015,即 ES6.0,2016-06 发布 ES2016,即 ES6.1;标准委员会最终决定每年 6 月正式发布一次,用年份标记版本。
Array.prototype.includes
是ES2016
的提案,我们把这里作为一个里程碑来考虑和兼容性有关的设置。- 由于我们使用
babel@7
和core-js@3
来处理兼容性,所以实际需要参考的数据是 core-js-compat,而不是 MDN 或者 CanIUse 等。 - 该份数据指出
includes
是在chrome 53
实现的,因此设置not chrome < 52
会导致引入require("core-js/modules/es.array.includes.js")
,而not chrome < 53
则不会引入该行- 实际需要用
chrome > 0, chrome < 52
来测试,否则会被其它浏览器的干扰 - MDN 认为
chrome 48
已经实现该特性,但我们应该以core-js-compat
的数据为准 - 由于 FireFox 很长一段版本实现有问题,导致 core-js-compat 认为
firefox 102
才开始真正支持该特性,所以大部分的配置方式都会导致引入 - 由于 IE 始终没有实现,所以需要兼容 IE 的配置方式都会导致引入
- 实际需要用
- 我们考虑选择
chrome 52
作为这个里程碑标记,即经过兼容性处理后的代码应该能在chrome 52
上正常运行;体现在本例中即 应该 引入。- chrome 52 发布于 2016-07-20
- 据此选择了
firefox 48
2016-08-02 - 据此选择了
edge 38
2016-08-02 - 据此选择了
safari 10
,ios_saf 10
2016-09-20
- Android 于 2014-10 发布了
5.0 Lollipop
,此版本起用户可以从商店升级 WebView,即版本号和 Chrome 一致了。考虑到 >99% 用户机型占比,选择了android 5
来作为一个里程碑。 - SamSung 12 发布于 2020-06-19,使用了 Chrome 79,所以暂时不处理它。
2022-10-06,以上配置对用户的覆盖率是 83.8%
但 cover 100% in CN
的覆盖率也只有 90.3%,所以还需要根据实践调整
遗留问题:
- 以上里程碑标记保证的是 ES2016+ 的兼容性,即
Arrays.prototype.includes
及其之后的所有特性,并没有涉及 ES2015,即我们俗称的 ES6,例如Arrow Function
。 - 看上去 对于 Android >=5 和 iOS >= 10 来说原生支持;并且看上去 ES2016 也是原生支持的;但从 ES2017 开始支持得就不太好了,所以以上将里程碑定在 ES2016 即 Array.prototype.includes 应该有足够的代表性。
- 观察构建制品会发现,Babel 对于 ES2015 是有一定处理的,但暂时没有找到文档支持具体处理或不处理了哪些,如果在实践中遇到问题,再考虑补测试用例。