babel 预设
@babel/preset-env 的使用
babel 有多种预设,最常见的预设是@babel/preset-env
@babel/preset-env可以让你使用最新的 JS 语法,而无需针对每种语法转换设置具体的插件
下载
sh
pnpm i -D @babel/preset-env配置
json
{
"presets": ["@babel/preset-env"]
}兼容的浏览器
@babel/preset-env需要根据兼容的浏览器范围来确定如何编译,和 postcss 一样,可以使用文件.browserslistrc来描述浏览器的兼容范围
last 3 version
> 1%
not ie <= 8自身的配置
和postcss-preset-env一样,@babel/preset-env自身也有一些配置
配置方式是:
json
{
"presets": [
[
"@babel/preset-env",
{
"配置项1": "配置值",
"配置项2": "配置值",
"配置项3": "配置值"
}
]
]
}其中一个比较常见的配置项是useBuiltIns,该配置的默认值是 false
它有什么用呢?由于该预设仅转换新的语法,并不对新的 API 进行任何处理
例如:
js
new Promise((resolve) => {
resolve();
});转换的结果为
js
new Promise(function (resolve) {
resolve();
});如果遇到没有 Promise 构造函数的旧版本浏览器,该代码就会报错
而配置usebuiltins可以在编译结果中注入这些新的 API,它的值默认为false,表示不注入任何新的 API,可以将其设置为usage,表示根据 API 的使用情况,按需导入 API
json
{
"presets": [
[
"@babel/preset-env",
{
"useBuiltIns": "usage",
"corejs": 3
}
]
]
}同时需要将另外两个库安装:(安装到生产依赖中)
sh
#corejs实现了一些新的API转换,babel编译的时候会从这里去引入
pnpm i core-js -S
#regenerator-runtime支持了一些特殊的语法,比如async等
pnpm i regenerator-runtime -S实践
我们看一下 babel 编译之后的结果:
js
const a = 10;
//preset预设只会转换新的语法,并不会对新的API进行转换,对新的API进行转换需要依赖corejs
new Promise((resolve) => {
resolve();
});编译:
js
"use strict";
//不自己构建,而是依赖了corejs这个库
require("core-js/modules/es.object.to-string.js");
require("core-js/modules/es.promise.js");
var a = 10;
//preset预设只会转换新的语法,并不会对新的API进行转换,对新的API进行转换需要依赖corejs
new Promise(function (resolve) {
resolve();
});我们到时候只需要根据控制台提示来完善该插件所需的依赖即可。