Babel 的 targets 配置到底该怎么写才生效? 令狐煜喆 提问于 2026-02-25 09:18:23 阅读 45 工具 我最近在项目里用 Babel 转译代码,想兼容到 IE11,但发现配置了 targets: { ie: '11' } 后,生成的代码还是用了箭头函数,明显没转成 ES5。是不是我写法有问题? 我的 .babelrc 是这样写的: { "presets": [ ["@babel/preset-env", { "targets": { "ie": "11" } }] ] } 但打包出来的代码里还是有 () => {},这不应该啊?是不是还要配别的选项? 我来解答 赞 8 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 Mr-新霞 Lv1 你的配置写法本身没问题,targets: { ie: "11" } 是正确的格式。 问题大概率出在 browserslist 覆盖了你的 targets。如果项目根目录有 .browserslistrc 文件,或者 package.json 里写了 browserslist 字段,这些会优先生效,把你的 targets 配置直接无视掉。 你可以先检查一下这两个地方有没有配置。如果确实有,删掉或者改成你想要的目标浏览器就行。 另外有个点要注意:preset-env 默认只转换语法层面的东西,比如箭头函数、模板字符串这些。但模块语法(import/export)默认不转,因为要配合 webpack 做 tree-shaking。如果你用的是 webpack 生产模式,打包出来的代码可能还是会保留一些 ES6 语法,这是正常的,不是转译失败。 如果确认没有 browserslist 覆盖,还是不行的话,可以试试把配置改成这样: { "presets": [ ["@babel/preset-env", { "targets": "> 0.25%, not dead, ie 11" }] ] } 或者直接在 package.json 里加: "browserslist": [ "ie 11" ] 这样 browserslist 和 targets 都指向同一个目标,应该就不会冲突了。 回复 点赞 1 2026-03-12 16:08 设计师开心 Lv1 你这个配置写法本身没错,但问题出在 Babel 默认只转译语法(syntax),不自动注入 polyfill,所以像箭头函数这种语法,如果目标浏览器支持的话,它就不会转。 但 IE11 明确不支持箭头函数,那为什么没转?因为 @babel/preset-env 默认的 useBuiltIns 是 "usage" 或 "false",得配合 core-js 才能正确处理 polyfill 和语法降级。 你得加两步: 第一,安装依赖: npm install --save-dev @babel/preset-env @babel/core core-js 第二,把 .babelrc 改成这样: { "presets": [ ["@babel/preset-env", { "targets": { "ie": "11" }, "useBuiltIns": "usage", "corejs": 3 }] ] } 注意 useBuiltIns: "usage" 是关键,它会根据你代码里用到的 API 和目标浏览器自动注入需要的 polyfill,同时也会让 Babel 知道“这个浏览器不支持箭头函数”,从而把 () => {} 转成 function () {}。 别忘了你项目里还得 import core-js/stable 和 regenerator-runtime/runtime(如果用了 async/await),或者用 @babel/polyfill(但那个已经废弃了,别用)。 顺带说一句,如果还是不转,可能你用了 Babel 7.4+ 的默认行为,或者 Webpack 里 loader 没走 Babel(比如你只配了 .babelrc,但 Webpack 用的是 babel-loader 的 inline options 覆盖了配置),这种情况得检查下 loader 配置是不是也显式传了 presets。 JS 里这种“看起来配了但没生效”的坑我踩过无数次,真不是你一个人的事,多看一眼生成的 package.json 里有没有 browserslist 字段,有时候它会偷偷覆盖 Babel 的 targets。 回复 点赞 3 2026-02-25 09:26 加载更多 相关推荐 2 回答 53 浏览 Babel配置中设置targets时,为什么指定了浏览器版本却没转译某些语法? 我在项目里用Babel配置了targets为"chrome 90",但发现代码里的箭头函数() => {}仍然没被转译。明明用的是Chrome 80测试时会报错啊,这是怎么回事? 尝试过在.ba... UX文轩 工具 2026-02-16 16:50:25 1 回答 42 浏览 Babel 的 useBuiltIns 配置到底该怎么用? 我在项目里用了 Babel 和 core-js,想按需引入 polyfill,但配置 useBuiltIns: 'usage' 后打包体积反而变大了,是不是哪里搞错了? 我的 .babelrc 是这样... 司空文明 工具 2026-03-22 18:13:20 1 回答 28 浏览 Babel 的 useBuiltIns 配置到底该怎么用? 我最近在项目里配置 Babel,想用 useBuiltIns: 'usage' 来按需引入 polyfill,但发现打包后体积还是很大,而且有些新 API(比如 Array.prototype.fla... 星语 工具 2026-03-01 11:25:23 2 回答 41 浏览 为什么用了@babel/preset-env后箭头函数没被转译? 折腾了一下午还是没解决,项目里用了Babel和@babel/preset-env配置了targets,但箭头函数在打包后居然没转译成普通函数,Chrome没问题,用IE11直接报错。配置文件应该没问题... Mr-金利 工具 2026-02-15 11:48:25 2 回答 70 浏览 Babel配置后箭头函数没转成普通函数,旧版浏览器报错怎么办? 我在项目里用了箭头函数写组件方法,按照教程安装了@babel/preset-env并配置了.babelrc: { "presets": ["@babel/preset-env"] } 但打包后代码里箭... 萌新.文雅 工具 2026-02-15 13:24:30 1 回答 36 浏览 Babel插件里怎么判断一个节点是不是箭头函数? 我正在写一个Babel插件,想只处理箭头函数,但不知道怎么准确判断节点类型。试过node.type === 'ArrowFunctionExpression',但在某些情况下好像不生效? 比如下面这段... 技术彦杰 工具 2026-03-30 22:02:11 2 回答 48 浏览 Babel自定义插件怎么处理CSS-in-JS里的样式对象? 我写了个Babel插件想转换CSS-in-JS的对象写法,但不确定怎么准确识别和修改这种结构。比如下面这种写法: const styles = { color: 'red', fontSize: '1... 东方风珍 工具 2026-03-19 09:40:18 2 回答 62 浏览 Babel 配置 corejs 时报错怎么解决? 我在项目里用 Babel 转译代码,想用 core-js 做 polyfill,但一跑就报错说找不到 core-js 的版本。我明明装了 core-js@3,也在 babel.config.js 里写... A. 梓怡 工具 2026-03-04 19:52:22 2 回答 32 浏览 Babel插件里怎么修改AST节点的值? 我在写一个Babel插件,想把代码里的某个字符串字面量替换成别的内容,但改完没生效,是不是哪里搞错了? 比如这段代码: const msg = 'hello world'; console.log(m... 百里瑞雪 工具 2026-03-02 15:18:19 2 回答 40 浏览 Babel插件怎么处理JSX中的自定义组件标签? 我写了个Babel插件想把所有自定义组件(首字母大写的JSX标签)替换成函数调用,但插件好像没生效。我试过匹配JSXOpeningElement节点,判断name.name[0]是不是大写,但调试发现... 继芳🍀 工具 2026-02-25 19:46:21
问题大概率出在 browserslist 覆盖了你的 targets。如果项目根目录有 .browserslistrc 文件,或者 package.json 里写了 browserslist 字段,这些会优先生效,把你的 targets 配置直接无视掉。
你可以先检查一下这两个地方有没有配置。如果确实有,删掉或者改成你想要的目标浏览器就行。
另外有个点要注意:preset-env 默认只转换语法层面的东西,比如箭头函数、模板字符串这些。但模块语法(import/export)默认不转,因为要配合 webpack 做 tree-shaking。如果你用的是 webpack 生产模式,打包出来的代码可能还是会保留一些 ES6 语法,这是正常的,不是转译失败。
如果确认没有 browserslist 覆盖,还是不行的话,可以试试把配置改成这样:
{
"presets": [
["@babel/preset-env", {
"targets": "> 0.25%, not dead, ie 11"
}]
]
}
或者直接在 package.json 里加:
"browserslist": [
"ie 11"
]
这样 browserslist 和 targets 都指向同一个目标,应该就不会冲突了。
但 IE11 明确不支持箭头函数,那为什么没转?因为
@babel/preset-env默认的useBuiltIns是"usage"或"false",得配合core-js才能正确处理 polyfill 和语法降级。你得加两步:
第一,安装依赖:
第二,把
.babelrc改成这样:注意
useBuiltIns: "usage"是关键,它会根据你代码里用到的 API 和目标浏览器自动注入需要的 polyfill,同时也会让 Babel 知道“这个浏览器不支持箭头函数”,从而把() => {}转成function () {}。别忘了你项目里还得 import core-js/stable 和 regenerator-runtime/runtime(如果用了 async/await),或者用
@babel/polyfill(但那个已经废弃了,别用)。顺带说一句,如果还是不转,可能你用了 Babel 7.4+ 的默认行为,或者 Webpack 里 loader 没走 Babel(比如你只配了
.babelrc,但 Webpack 用的是babel-loader的 inline options 覆盖了配置),这种情况得检查下 loader 配置是不是也显式传了presets。JS 里这种“看起来配了但没生效”的坑我踩过无数次,真不是你一个人的事,多看一眼生成的
package.json里有没有browserslist字段,有时候它会偷偷覆盖 Babel 的 targets。