babel ES6 转换 ES5 实现原理

  • 前言
  • babel 各种包介绍
  • 转换过程
  • 案例

前言

前面写过一篇简单的 AST 抽象语法树的文章 简述 AST 抽象语法树。今天来看一下在 babel 中是如何将 ES6 转换为 ES5 的 。

babel 各种包介绍

babel-core:核心包,提供转译的 API,用于对代码进行转译。例如 babel.transform。在 webpack 中 babel-loader 就是通过这个包实现。
babylon:babel 的词法解析器。将原始代码逐个字母地像扫描机一样读取分析得出 AST 语法树结构。
babel-traverse:对 AST 进行遍历转译。
babel-generator:将新的 AST 语法树生成新的代码。
babel-types:用于检验、构建和改变 AST 树的节点
babel-template:辅助函数,用于从字符串形式的代码来构建 AST 树节点
babel-helpers:一系列预制的 babel-template 函数,用于提供给一些 plugins 使用
babel-code-frames:用于生成错误信息,打印出错误点源代码帧以及指出出错位置
babel-plugin-xxx:babel 转译过程中使用到的插件,其中 babel-plugin-transform-xxx 是 transform 步骤使用的。
babel-preset-xxx:transform阶段使用到的一系列的 plugin。
babel-polyfill:JS 标准新增的原生对象和 API 的 shim,实现上仅仅是 core-js 和 regenerator-runtime两个包的封装。
babel-runtime:功能类似 babel-polyfill,一般用于 library 或 plugin 中,因为它不会污染全局作用域。
参考:https://www.jianshu.com/p/e9b94b2d52e2

转换过程

转换过程分为三步:

  1. Parser 解析
    第一步主要是将 ES6 语法解析为 AST 抽象语法树。简单地说就是将代码打散成颗粒组装的对象。这一步主要是通过 babylon 插件来完成。
  2. Transformer 转换
    第二步是将打散的 AST 语法通过配置好的 plugins(babel-traverse 对 AST 进行遍历转译)和 presets (es2015 / es2016 / es2017 / env / stage-0 / stage-4 其中 es20xx 表示转换成该年份批准的标准,env 是最新标准,stage-0 和 stage-4 是实验版)转换成新的 AST 语法。这一步主要是由 babel-transform 插件完成。plugins 和 presets 通常在 .babelrc 文件中配置。
  3. Generator 生成
    第三步是将新的 AST 语法树对象再生成浏览器都可以识别的 ES5 语法。这一步主要是由 babel-generator 插件完成。

案例

举个简单的例子,比如代码块 let a = 10 中有 ES6 语法 let。转换的过程如下:

  1. 使用 在线 astexplorer 将代码块解析成 AST 语法树。
{"type": "Program","start": 0,"end": 10,"body": [{"type": "VariableDeclaration","start": 0,"end": 10,"declarations": [{"type": "VariableDeclarator","start": 4,"end": 10,"id": {"type": "Identifier","start": 4,"end": 5,"name": "a"},"init": {"type": "Literal","start": 8,"end": 10,"value": 10,"raw": "10"}}],"kind": "let"}],"sourceType": "module"
}
  1. 将以上 AST 语法树对象中的 ES6 语法 let 替换成 var
  2. 再将新的语法树生成新的代码 var a = 10

babel ES6 转换 ES5 实现原理相关推荐

  1. es6转换es5 babel配置

    npm install --save-dev babel-preset-es2015 babel-cli .babelrc文件 "presets":[         " ...

  2. babel es6转es5

    首先需要安装依赖环境 npm i --save-dev babel-cli babel-preset 安装es5转换 npm i --save-dev babel-preset-es2015 安装po ...

  3. ES6代码转为ES5代码babel在线转换

    ES6代码转为ES5代码babel在线转换 es6转es5还是很有用的.有的时间项目不大,不用配置webpack,就是个单页文件,又想用es6语法,写完可以直接转换一下就OK了.快捷方便. https ...

  4. ES6中的class是如何实现的?(附Babel编译的ES5代码详解)

    序言 这篇文章主要讲解面试某大厂遇到的一个问题 - ES6中的class语法的实现? ECMAScript 6 实现了class,class是一个语法糖,使得js的编码更清晰.更人性化.风格更接近面向 ...

  5. ES6转ES5:Gulp+Babel

    目标: ES6代码转成ES5 对转换后的ES5进行压缩 以上步骤自动监控执行 步骤: 1.安装插件 在命令行中定位到项目根目录 安装全局 Gulp npm install -g gulp 安装项目中使 ...

  6. es5直接引入html文件,ES6+转ES5(webpack+babel、指定多个js文件、自动注入)

    接续上篇ES6+转ES5,本篇将使用webpack和babel将多个不同目录下指定的多个ES6+语法的js文件编译为ES5,并将编译后的文件配置注入对应的html文件. 一.新建项目,目录如下 二.执 ...

  7. 如何将ES6转换成ES5?

    一. 介绍 ECMAScript 6(ES6)的发展速度非常之快,但现代浏览器对ES6新特性支持度不高,所以要想在浏览器中直接使用ES6的新特性就得借助别的工具来实现. Babel是一个广泛使用的转码 ...

  8. babel—ES6代码转换为ES5代码

    为什么要将ES6代码转换为ES5代码? 为了浏览器兼容,以及为了在node.js环境可以顺畅运行应用程序.ES6作为JS的新规范,加入了很多新的语法和API,但现代浏览器对ES6新特性支持度不高,所以 ...

  9. webpack之配置es6转换成es5

    webpack之配置es6转换成es5 为什么要将代码中的es6语法转换成es5语法呢?这是因为有些浏览器无法识别es6语法.而webpack在不借助babel的情况下,只能对js进行打包处理,无法将 ...

最新文章

  1. Python面向对象进阶及类成员
  2. Android --- View.inflate()的详细介绍
  3. 【最新合集】编译原理习题(含答案)_1 绪论_MOOC慕课 哈工大陈鄞
  4. php利用mkdir()创建多级目录
  5. 三种方法构建简单的WEB服务器!
  6. 程序员如何成为编程高手并以此创业
  7. python debug run 结果不同_Python:PyCharm中运行与调试模式下的不同行为
  8. JS Array创建及concat()split()slice()使用
  9. 基于python 爬虫_基于python的爬虫(一)
  10. Javascript模块化编程 (附WebTrends的dcsMultiTrack方法浅述)
  11. WPF实现截图功能——WPF制作文字OCR软件(三)
  12. 软件测试VS软件开发 IT行业两大高薪岗位全方位对比 看完就知道选谁了
  13. 使用 customize-cra 修改 webpack 配置
  14. Oracle锁机制深度分析
  15. Vue项目引用高德地图实现车辆轨迹回放
  16. java线上CPU、内存打满处理
  17. 公积金总结(一)--公积金概念
  18. React 父子组件的生命周期关系(16.4版本及以后)
  19. GlusterFS 和 Ceph 比比看
  20. Linux 基本命令 第二天

热门文章

  1. Linux 在线安装MYSQL
  2. C语言,变长数组的用法
  3. JAVA异常处理、自定义异常、throws关键字与throw关键字、运行时异常
  4. 南师大计算机学科评估排名,南京师范大学a类b类学科有哪些?附南京师范大学第四轮学科评估结果...
  5. VN服务器IP地址切换,客户端连接解决方案!
  6. 对华为畅玩手机5X进行升级
  7. error LNK1104: 无法打开文件“libboost_date_time-vc120-mt-sgd-1_64.lib”
  8. Cadence IC 模拟版图初学手记
  9. Hybrd A*(混合A*)算法
  10. 【ONE·Data || 基础数据结构相关练习(一)】