Babel 之 @babel/preset-env

本文介绍了Babel 7.0后@babel/preset-env的高效用法,包括其作为智能预设的作用、依赖的开源项目、配置选项如targets、include和exclude,以及如何通过.browserslistrc进行目标环境管理和polyfill处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Babel 已经成为前端工程化开发的必备工具链。自 Babel 7.0 以后,Babel 进一步对工具优化和插件统一管理,全面迁移到 @babel 中。@babel/preset-env 是十分常用的一组预先设定的插件,今天就来简单聊聊这个插件

@babel/preset-env

这是一个智能预设,它允许你使用最新的 JavaScript 语法,而无需对目标环境需要哪些语法转换进行管理。

npm install @babel/core @babel/preset-env -D

@babel/preset-env 依赖了一些优秀的开源项目,比如: browserslist, compat-table, electron-to-chromium 等.

@babel/preset-env 不会包含任何低于 Stage 3 的 JavaScript 语法提案,因为在 TC39 流程的那个阶段,它无论如何都不会被任何浏览器实现。这些要支持的语法都将需要手动包含。 shippingProposals 选项将包括一些浏览器已经实现的 Stage 3 提案。

@babel/preset-env takes any target environments you’ve specified and checks them against its mappings to compile a list of plugins and passes it to Babel.

简而言之,@babel/preset-env 就是利用你指定的任何目标环境,然后检查它们对应的插件,并传给 Babel 进行转译.

安装好 @babel/preset-env 后,需要在工程更目录新建一个配置文件 .babelrc 或者 babel.config.js :

{
	"presets": [
		[
			"@babel/preset-env"
		]
	]
}

如果不指定其他配置选项,比如 targets, @bable/preset-env 会将所有的 ECMAScript 2015+ 代码按照默认配置进行转换.

通常,不推荐这样使用, 因为这样就没有利用到其支持特定浏览器的能力.

{
	"presets": [
		[
			"@babel/preset-env", {
				"targets": {
					"chrome": "68",
					"ie": "11"
				}
			}
		]
	]
}

Options: targets

描述项目支持的目标环境, 可以是一个 browserlist-compatible 查询语句, 或者是一个描述支持的最小的环境版本的对象

{
	"presets": [
		[
			"@babel/preset-env", {
				"targets": "> 0.25%, not dead"
			}
		]
	]
}

不过,一般我们会直接使用 .browserslistrc 配置文件指定 tagets , 或者直接在 package.json 中配置 browserslist 选项,这样同时可以被其他生态内的工具使用,比如 autoprefixer .

{
	"presets": [
		[
			"@babel/preset-env", {
				"targets": {
					"chrome": "68",
					"ie": "11"
				}
			}
		]
	]
}

而描述一个对象是十分简单的方式,如上代码所示.

其包括的环境有如下: chrome, opera, edge, firefox, safari, ie, ios, android, node, electron

Options: targets.esmodules

如果代码运行的浏览器支持 ES Modules,应当指定如下配置.不过,此时 browsers 选项将被忽略

{
	"presets": [
		[
			"@babel/preset-env", {
				"targets": {
					"esmodules": true
				}
			}
		]
	]
}

Options: targets.browsers

这是一个利用 browserlist 的查询选项 (这个选项将会被移除)

{
	"presets": [
		[
			"@babel/preset-env", {
				"targets": {
					"browsers": "> 0.25%, not dead"
				}
			}
		]
	]
}

效果同

{
	"presets": [
		[
			"@babel/preset-env", {
				"targets": "> 0.25%, not dead"
			}
		]
	]
}

Options: include

指定包含的插件的数组

其合法的配置如下:

  • Babel plugins
{
	"presets": [
		[
			"@babel/preset-env", {
				"targets": "> 0.25%, not dead",
				"include": [
					"@babel/plugin-transform-spread",
					"plugin-transform-spread"
				]
			}
		]
	]
}

注意: 代码前缀 @babel/ 和不带前缀,都是支持的

  • Built-ins , 这个就是配置支持 core-js@2core-js@3 , 如 es.map, es.set, es.object.assign
{
	"presets": [
		[
			"@babel/preset-env", {
				"targets": "> 0.25%, not dead",
				"include": [
					"@babel/plugin-transform-spread",
					"plugin-transform-spread",
					"es.map",
					"es.object.assign"
				]
			}
		]
	]
}

插件的名字,可以是完整的,部分的,还可以使用正则表达式:

  • 全称(string): "es.object.assign"

  • 部分名称(string): "es.object.*" , 这个会解析所有以 es.object 为前缀的插件模块

  • 正则表达式(object): /^transform-.*$/ 或者 new RegExp("^transform-.*")

Options: exclude

设置不包含或者移除的插件数组,配置方法与 include 选项类似.

{
	"presets": [
		[
			"@babel/preset-env", {
				"targets": "> 0.25%, not dead",
				"include": [
					"@babel/plugin-transform-spread",
					"plugin-transform-spread",
					"es.map",
					"es.object.assign"
				],
				"exclude": [
					"/^transform-.*$/"
				]
			}
		]
	]
}

Options: useBuiltIns

数据类型: "usage" "entry" | false, 默认为 false.

这个选项主要是指定 @babel/preset-env 将如何处理 polyfill,通常与 corejs选项配合使用.

{
	"presets": [
		[
			"@babel/preset-env", {
				"useBuiltIns": "usage",
				"corejs": "3"
			}
		]
	]
}

还有一些其他的选项,可以查看官方文档: @babel/preset-env

### 解决方案分析 当遇到 `npm install --save-dev @babel/preset-env` 安装失败的问题时,可能的原因包括网络问题、缓存冲突、依赖版本不兼容或其他环境因素。以下是详细的解决方案: #### 1. **检查网络连接** 如果网络不稳定可能导致安装中断或文件下载不全。可以通过更换镜像源来尝试解决问题。例如,使用淘宝 NPM 镜像: ```bash npm config set registry https://registry.npm.taobao.org ``` 完成后再次运行安装命令。 #### 2. **清理 npm 缓存** 有时缓存中的损坏数据会引发安装错误。可以清除本地缓存并重试: ```bash npm cache clean --force npm install --save-dev @babel/preset-env ``` #### 3. **验证 Node.js 和 npm 版本** 确保使用的 Node.js 和 npm 版本与项目的最低需求匹配。Babel 对 Node.js 的支持有一定要求[^2]。可以通过以下命令检查当前版本: ```bash node -v npm -v ``` 建议升级到 LTS (长期支持版) 或更高版本以减少潜在的兼容性问题。 #### 4. **删除 node_modules 并重新安装** 如果之前存在未完成的安装操作,可能会导致目录结构混乱。先移除整个 `node_modules` 文件夹以及锁定文件 (`package-lock.json`),再重新安装所有依赖项: ```bash rm -rf node_modules package-lock.json npm install ``` #### 5. **切换至 Yarn 或其他工具** 部分情况下,Yarn 能更稳定地处理依赖关系。按照提示替换为 Yarn 来管理项目依赖也能有效规避某些特定场景下的 bug[^4]: ```bash yarn add --dev @babel/preset-env ``` #### 6. **确认目标平台的一致性** 跨设备迁移开发环境时需注意操作系统差异带来的影响。比如 Windows 上构建好的工程迁移到 macOS/Linux 下可能出现路径解析异常等问题。因此最好统一各阶段所处的工作站设置。 --- ### 示例代码片段展示如何正确配置 `.babelrc` 文件以便利用 preset-env 功能转换 JavaScript 语法: 创建或编辑根目录下的`.babelrc`, 添加如下内容: ```json { "presets": [ ["@babel/preset-env", { "targets": "> 0.25%, not dead", "useBuiltIns": "usage" }] ] } ``` 上述 JSON 设置说明了依据现代浏览器覆盖率自动调整转译策略的同时引入必要的 Polyfills 支持老式特性调用. --- ### 总结注意事项 以上方法覆盖了大部分常见原因引起的 Babel Preset Env 插件无法成功加载的情况。实际排查过程中应逐一测试直至恢复正常工作状态为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值