@babel/preset-env

@babel/preset-env

@babel/preset-env 是一个智能预设,它允许你使用最新的 JavaScript ,而无需对目标环境需要哪些语法转换进行各种繁琐细节的管理。这不仅让你轻松,而且事 js 包更小!

Install

使用 npm :

npm install --save-dev @babel/preset-env

使用 yarn :

yarn add @babel/preset-env --dev

工作原理

如果不是一些很棒的开源项目,比如 browserslist, compat-table , 和 electron-chromium ,@babel/preset-env 将不会做到上面所说的一切。

我们依靠这些开源项目提供的数据,维护了两个映射,一个是不同版本的目标环境拥有的 js 特性或着浏览器特性,一个是 Babel 的转译插件和 core-js 的 polyfills 同 这些 js 特性和浏览器特性的映射。

注意:@babel/preset-env 不会包含任何低于 TC39 的第三阶段的 JavaScript 语法提案,因为此时绝对不会有浏览器支持。这些需要手动包含。设置 shippedProposals 选项将会包含一些浏览器已经实现的第三阶段提案。

在你设置任意目标环境后,@babel/preset-env 会根据上面说的映射关系检查你的代码,并生成一个插件列表传递给 Babel 。

生成 Browserslist

对于基于浏览器或者 Electron 的项目,我们建议使用 .browserslist 文件来指定目标环境。你可能会已经有这个配置文件了,因为它也被其他工具使用,比如 autoprefixer, stylelint, eslint-plugin-compat 等等。

默认情况下 @babel/preset-env 将使用 browserslist ,除非设置了 targets 或 ignoreBrowserslistConfig 选项。

例如,设置浏览器市场份额 >0.25% 用户的 polyfills 和代码转换。

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

Browserslist

> 0.25%
not dead

或者

Package.json

"browserslist": "> 0.25%, not dead"

选项

targets

string | Array<string> | { [string]: string } ,如果没有 browserslist ,默认最外层的 targets 选项,否则 {}。

它是描述你项目要支持的目标环境。

它可以是一个浏览器的用户范围:

{
  "targets": "> 0.25%, not dead"
}

或具体某个产品的版本:

{
  "targets": {
    "chrome": "58",
    "ie": "11"
  }
}

示例环境: chrome, opera, edge, firefox, safari, ie, ios, android, node, electron.

没有 targets

由于 preset-env 的最初设计目标是帮助用户使用 preset-latest 轻松的过渡,因此在为指定 targets 时,preset-env 会将所有 ES2015-ES2020 的代码转化为 ES5 。

我们不建议以这种方式使用预设环境,因为它没有利用其针对特定目标环境版本的能力。

因此, preset-env 的行为与 browserslists 不同:当 Babel 没有 targets 配置或者没有 browserslists 配置,它不会默认查询,如果你想使用默认查询,你就需要显示的配置(browserslists的默认是 > 0.5%, last 2 versions, Firefox ESR, not dead ):

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

如果你也想用 > 0.5%, last 2 versions, Firefox ESR, not dead ,就得显式配置。我们认识到这并不理想,Babel8将会重新考虑。

modules

"amd" | "umd" | "systemjs" | "commonjs" | "cjs" | "auto" | false,默认是 auto

是否将 ESM 转化为其他模块化标准。请注意,cjs 是 commonjs 的别名。

将此设置为 false 将保留 ESM 不受转换,仅当你打算将 ESM 用在浏览器上才用这个。如果你在 Babel 中使用 bundler ,建议你开启默认值。

useBuiltIns

"usage" | "entry" | false, 默认是 false

这个选项配置 @babel/preset-env 如何使用 polyfills。

当这个配置选项为:usageentry ,@babel/preset-env 会直接建立起对于 core-js 相关 module 的引用。因此这也意味着 core-js 会被解析为对应的相对路径同事需要确保 core-js 在你的项目中已经被安装了。

因为从 @babel/polyfill 从 7.4.0 版本开始就被弃用了,因此推荐直接配置 corejs 选项,并在项目当中直接安装 core-js

我的理解是,如果你只使用 entry,是需要手动引入 core-js 的,因为要在全局引入 polyfills 。使用 usage ,就相当于自动按需加载 polyfills,babel会默认使用 core-js@2 ,想使用@3的话,配置corejs 选项。

总结

@babel/preset-env 不是必须的,但不设置 Babel 就相当于没干活。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358

推荐阅读更多精彩内容