babel7 重新理解

瘢痂柯里化
• 阅读 3380

测试环境

node 10.14.1
Babel 7.4.3

Babel 是什么?

Babel 是一个工具链,主要用于将 ECMAScript2015+版本的代码转换为向后兼容的 Javascript 代码,以便能够运行在当前和旧版本的浏览器或其他环境中。

Babel 主要功能点:

  • 语法转换
  • 垫片兼容处理,通过 Polyfill 方式在目标环境中添加缺失的特性
  • 源码转换
  • 其他...

使用理念

  1. Babel 主要通过 插件 plugins 的形式 达到转换代码的目的。
  2. Babel 本身内置了部分环境预设 preset-env,当然项目中 需要根据实际 进行配置。
  3. 为了方便书写参数,一般通过 配置文件的方式 babel.config.js 或者.babelrc.js(以编程的方式创建配置)或者.bablerc

Babel 编译两大核心

- 语法转换
- 垫片支持

Bable 核心模块

@babel/core

Babel 语法转换核心功能,内置 helpers 插件模块,是语法转换的主要辅助工具

@babel/preset-env

这是一个非常智能的环境预设模块,根据 env 配置自动 分析查找对应的 helper 和 plugins 进行代码编译转换
基本使用:

presets: [
  [
    '@babel/preset-env',
    {
      targets: {
        chrome: '77',
        android: '2',
      },
      debug: true,
      useBuiltIns: false,
    },
  ],
],

其他参数参考文档配置就好了,这里重点分析一下 useBuiltIns 属性.
targets 可根据文档自行配置,这个比较简单。
debug 调试模式,建议开启,开启之后可以看到 那些 target 使用了那些 plugins 和 polyfill

// 开启debug 模式的构建信息
Using targets:
{
  "android": "2",
  "chrome": "77"
}

Using modules transform: auto

Using plugins:
  transform-template-literals { "android":"2" }
  transform-literals { "android":"2" }
  transform-function-name { "android":"2" }
  transform-arrow-functions { "android":"2" }
  ......
  ......

Using polyfills with `usage` option:

[/Users/weng/Documents/dongsheng/projects/bable/src/app.js] Added following core-js polyfills:
  es6.object.set-prototype-of { "android":"2" }
  es6.object.create { "android":"2" }
  es6.symbol { "android":"2" }
  es7.symbol.async-iterator { "android":"2" }

[/Users/weng/Documents/dongsheng/projects/bable/src/app.js] Added following core-js polyfills:
  es6.string.includes { "android":"2" }
  es7.array.includes { "android":"2" }
  es6.array.of { "android":"2" }

useBuiltIns 属性使用:

  • false 不开启 polyfill 处理,只做语法代码转换。
  • usage 开启 polyfill 处理(依赖@babel/polyfill 模块)
  • entry 开启 polyfill 处理(依赖@babel/polyfill 模块)
    useBuiltIns 的值只要不为 false,就不启动 polyfill 兼容,其他值都会引入 polyfill,存在全量变量污染的特性。

@babel/plugin-transform-runtime & @babel/runtime & @babel/runtime-corejs2

正常情况下,每个文件都有局部引入自身的 helpers 函数实现,打包后放置在文件的最顶部。
所以存在一个情况,多个文件使用了同样的语法,那么同样的 helpers 会多次引入。
transform-runtime 就是解决这个问题的。
transform-runtime 为了减少代码量,引入的 helpers 只保留一份
看个栗子:
源代码:

//app.js
import { add } from './add';
function app() {
  add(1, 2);
  console.log(Object.assign({}, { ...{ name: 'd' } }));
  const _a = Array.of(3, 11, 8);
}
app();
export function add(a, b) {
  console.log('加法:');
  console.log(Object.assign({}, { ...a }));
}
// 不启动 transform-runtime 构建后:
// 包含了多个同样的 helpers

babel7 重新理解

plugins: ['@babel/plugin-transform-runtime'];
// 同样的helpers只加载一次,但是没有 方法api的实现

babel7 重新理解

// corejs设置版本号:2或者3,都会引入非实例方法api的兼容实现
plugins: [
  [
    '@babel/plugin-transform-runtime',
    {
      corejs: 2,
    },
  ],
];

babel7 重新理解

transform-runtime 也是做兼容的:

  • @babel/runtime 只做 语法转换的(helpers 和 regenerator),只做语法转换, 没有新 api 的实现
  • @balel/runtime-corejs2 除了 helpers 和 regenarator ,还有 core-js 垫片兼容实现,替换 非实例方法

prest-env 影响 语法转换 和 垫片兼容
而且自身还兼容了 默认的 代码转换功能,根据具体 env 分析要使用的 plugins

语法转换 和 垫片兼容 是两个 独立功能,只不过都是 根据 env 来 实现目标转换.

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Babel
Babel是JavaScript编译器,主要用于将ECMAScript2015版本的代码转换为向后兼容的JavaScript语法,以便能够运行在当前和旧版本的浏览器或其他环境中.中文官方地址https://www.babeljs.cn/(https://www.oschina.net/action/GoToLink?urlhttps%
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Babel总结
什么是babel?babel是一个JavaScript编译器。Babel是一个工具链,主要用于将ECMAScript2015代码转换为向后兼容的旧浏览器或环境中JavaScript版本。注解:传统的编译是指转化成可执行的代码,也就是二进制代码。但是对于前端来说,因为JS是解释性语言,对于浏览器或者Node来说就是可执行的代码。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这