我正在查看Babel 的 @babel/preset-env 文档,并注意到以下注释:
请注意,如果您依赖 browserslist 的默认查询(显式或没有 browserslist 配置),您将需要查看 No targets 部分以获取有关 preset-env 行为的信息。
当没有指定目标时:Babel 会假设你的目标是最旧的浏览器。例如,@babel/preset-env 会将所有 ES2015-ES2020 代码转换为 ES5 兼容。
因此,Babel 的行为与 browserslist 不同:当在 Babel 或 browserslist 配置中没有找到目标时,它不使用默认查询。如果要使用默认查询,则需要将其作为目标显式传递:
让我感到困惑的那一行: “当您的 Babel 或browserslist 配置中没有找到目标时,它不使用默认查询”。如果 中有一个默认查询,那.browserslistlrc
不意味着 browserslist 配置中有一个目标吗?文件的全部意义不.browserslistrc
在于有一个集中的位置来引用您的目标浏览器吗?维护两个独立的位置似乎容易出错。
我决定调查并打开debug
Babel 的标志。此时我的.babelrc
文件没有列出明确的目标,而我.browserslistrc
只是列出了defaults
. 运行 Babel 时,我在终端中得到以下输出:
Using targets:
{}
当我添加一个明确"targets": "defaults"
的 to.babelrc
时,输出发生了变化,现在列出了目标浏览器:
Using targets:
{
"android": "84",
"chrome": "83",
"edge": "84",
"firefox": "78",
"ie": "11",
"ios": "12",
"opera": "70",
"safari": "13.1",
"samsung": "11.1"
}
defaults
为了增加我的困惑,此列表与运行时 browserslist 报告的不匹配npx browserslist defaults
:
and_chr 97
and_ff 96
and_qq 10.4
and_uc 12.12
android 97
baidu 7.12
chrome 98
chrome 97
chrome 96
edge 98
edge 97
edge 96
firefox 96
firefox 95
firefox 91
firefox 78
ie 11
ios_saf 15.2-15.3
ios_saf 15.0-15.1
ios_saf 14.5-14.8
ios_saf 14.0-14.4
ios_saf 12.2-12.5
kaios 2.5
op_mini all
op_mob 64
opera 83
opera 82
safari 15.2-15.3
safari 15.1
safari 14.1
samsung 16.0
samsung 15.0
任何人都可以澄清这里发生了什么,并推荐一个最佳实践,如果你使用defaults
browserslist 查询@babel/preset-env
?