babel-preset-env

 阅读约 8 分钟

一、作用

根据你支持的环境自动决定适合你的Babel插件

二、历史版本(已被弃用)

1、babel-preset-latest

1.1 特点

包含了所有年度预设( babel-preset-es2015、babel-preset-es2016、babel-preset-es2017),无需用户单独指定某个预设。

1.2 缺点

部分转码多余 :如果使用默认设置,babel会将所有ES6与ES6+的新特性转成复杂的es5的代码。但是大部分现在浏览器已经支持ES6的部分特性。

2、babel-preset-es2015、babel-preset-es2016、babel-preset-es2017

2.1 特点

分别支持不同版本的ECMA规范,es2015将es6转成es5,es2016只将比es6新增加的特性转成es5。es2017也是只将比es6新增加的特性转成es5

2.2 缺点

如果同时要使用这三个插件,配置项书写麻烦

三、 配置

1、在没有任何配置选项的情况下

babel-preset-env 与 babel-preset-latest的行为相同

//默认设置
{
  "presets": ["env"]
}

2、stage-x(实验阶段presets)

默认不会包含stage-x插件,需要手动配置支持

//设置 stage-2的插件
{
  "presets": [
    ["env"],
    "stage-2"
  ]
}

3、可以设置的选项

以下仅为部分常用选项,其他请看官网

3.1 target 设置支持的运行环境

{ [string]: number | string }, 默认为 {}。

3.2 modules 将ES6模块语法转换为另一种模块类型

"amd" | "umd" | "systemjs" | "commonjs" | false, 默认为 "commonjs".

将其设置为 false 就不会转换模块。

3.3 debug console.log输出插件等信息

boolean, 默认为 false。

将使用的目标浏览器/插件和在 数据插件版本 中指定的版本用 console.log 输出。

3.4 useBuiltIns

boolean,默认为 false。

将polyfill应用于 babel-preset-env 中。

babel为新特性提供了polyfill,(例如为内置对象,静态方法,实例方法,生成器函数等提供了支持。 babel-preset-env可以基于特定环境引入需要的polyfill。

两种使用方法:

  • 方法一 core.js, 根据需要引入ES6,ES6+标准方法的实现。
 //安装 polyfill
 npm install core-js --save
      
 //使用polyfill
 import "core-js"
  
  • 方法二 babel-polyfill,包含了core-js 和regenerate-runtime (提供 async 语法编译后的运行时环境)。
 //安装 polyfill
 npm install babel-polyfill --save
    
 //使用polyfill
 import "babel-polyfill";

两种方法最终都会根据环境转译成特定的polyfill。 比如:

import "core-js/modules/es7.string.pad-start";
import "core-js/modules/es7.string.pad-end";
import "core-js/modules/web.timers";
import "core-js/modules/web.immediate";
import "core-js/modules/web.dom.iterable";

在整个应用里只能引入一次polyfill,可以在 “main” 模块里一次引入。多次 imports 或 requires babel-polyfill 会引起报错,因为它可能导致全局冲突和其他难以追踪的问题。

例如

{
  "presets": [
    [ "env", {
      "targets": {
        "safari": 10 //目标运行平台为safari10
      },
      "modules": false,//不转换模块
      "useBuiltIns": true,//使用polyfill
      "debug": true 
    }]
  ]
}

四、运行原理

下载 babel-preset-env源码 :https://github.com/babel/babe...

1、生成babel插件与平台的对应关系

定期执行 scripts/build-data.js用来生成最新的 build-ins.json 与 plugins.json

npm run build-data

1.1 使用 ECMA标准兼容性列表compat-table 确定平台(浏览器…)不同版本对js新特性的支持情况。

clipboard.png

1.2 使用 data/build-in-features.js 、 data/plugin-features.js 确定babel插件与js新特性的映射关系,如下图

clipboard.png

1.3 使用 ECMA标准兼容性列表 compat-table 与 data/build-in-features.js 、plugin-features.js 相匹配,来得到 babel的插件与各个平台版本的对应关系,如下build-ins.json中的部分代码
clipboard.png

2、配置与解析tagets

使用browserslist 支持的有效的查询格式来书写配置中的targets, 在源码内部也会使用 browserslist 来解析这些信息

{
  "presets": [
    ["env", {
      "targets": {
        "browsers": ["last 2 versions", "safari >= 7"]
      }
    }]
  ]
}

3、确定在 preset 的插件中支持的最低浏览器版本。

如果你的项目需要支持 IE8 和 Chrome 55 。它必须包括IE8所支持的所有插件。

4、支持 "node": "current" 用来编译当前项目的node版本。

例如,如果你基于Node 6构建项目,箭头函数将不会被转换。但项目基于Node 0.12的时候,它们将会被转换

阅读 855更新于 2018-09-07

推荐阅读
目录