默认情况下,babel-preset-env 和 babel-preset-latest(已弃用) 一样,包含三个 preset(babel-preset-es2015, babel-preset-es2016, and babel-preset-es2017)。
我们用一个简单的 Map 测试。
//source
var map = new Map();
var keyString = 'a string';
map.set(keyString, 'string\'s value');
console.log(map.get(keyString));
console.log(map.get('a string'));
默认情况下输入的结果除了加了一行 use strict 以外就啥也没做了。
//output
'use strict';
var map = new Map();
var keyString = 'a string';
map.set(keyString, 'string\'s value');
console.log(map.get(keyString));
console.log(map.get('a string'));
babel-preset-env 简介
默认情况下,babel-preset-env 和 babel-preset-latest(已弃用) 一样,包含三个 preset(babel-preset-es2015, babel-preset-es2016, and babel-preset-es2017)。
我们用一个简单的 Map 测试。
默认情况下输入的结果除了加了一行
use strict
以外就啥也没做了。这个时候我们增加编译环境 target,babel-preset-env 使用的是 browserlist 语法 做浏览器切分。这个配置可以放到
.babelrc
中这个时候我们把 debug 选项打开则可以看到
babel-preset-env
使用了具体哪些 plugin。现在
env
帮我们把语法层面的 transform-plugin 都搞进来了,但是我们发现在上面的输出代码中并没有 polyfill 进Map
类,我们可以手动引入core-js
对应的包,也可以全部交给babel-preset-env
,只需要改下配置这个时候我们再 build 以后看下输出
我们可以看到除了 plugin 以外,对应的 polyfill的包也出现在 debug 信息中,但这个时候还没有结束,我们需要手动引入
babel-polyfill
然后我们再看下 build 之后的文件。
总结
babel-preset-env
并不是根据使用到的语法来判断需要准备的 plugin 和对应的 polyfill,而是在 compile 阶段之前就根据 target 生成 plugin 和 polyfill 列表,然后根据这个列表做转换,所以说像这个示例中,我们就算只使用了一个Map
类,也会把 es6 的所有 polyfill 包搞进来,所以是否使用useBuiltIns:true
还要根据项目的情况来看。