本篇是根据最新babel 7版本写的,里面用到的一些babel相关包都是babel 7的
 
 
1,babel是如何工作的
babel是一个转译器,这里我严格区分了转译器和编译器,因为编译器最终生成的是机器指令,已经和最初的代码完全不一样了,而转译器只是将高级别的语言转化为低级别的语言,能更好的兼容,所以我把它称作转译器,仅仅做了转化。
 
babel的工作流程,简单来说,就是传入code字符串,经过一系列处理后,吐出code字符串,就像这样:   >Code => do something => Code
 
传统编译过程?(分词/词法分析,解析/语法分析AST,生成机器指令)
 
其实babel也类似,三个过程:解析,变换,再建
 
1,解析:
将代码字符串解析成AST(抽象语法树),在这一步里,babel会顺带进行语法的正确性校验
(关于这一步里,实际上就是编译器过程的第一二两步,生成AST的过程,具体的可参考之前的js编译原理那篇随笔)
 
2,变换:
遍历整个抽象语法树,对AST进行变换操作
 
3,再建:
再次递归遍历整个新的AST,根据变换后的AST再生成代码字符串
 
而我们在配置文件中写的 presets 和 plugins 就是在第二阶段 变换 过程中使用的
2,plugin是干嘛用的
plugin就是用在do something的时候,如果没有plugin,code还是原字符串返回,不作处理
plugin会运行在preset之前
plugin是从前往后,而preset是从后往前执行
3,presets是干嘛用的
preset是用来组合plugin的,无需我们手动安装很多plugin,而是提供了一组插件的集合(单点和套餐的区别)
比如我们用react的时候,我们就要添加@babel/preset-react,用ts的时候,就要添加@babel/preset-typescript
4,presets一些常见的配置项的功能及作用
env: 通过配置得知当前目标环境的特点,然后只做必要的转换,如果不写配置项,默认env为latest,也等价于es2015 + es2016 + es2017三个相加
5,其它一些相关的包
 
@babel/core
这个包里提供了很多代码转化的API,可以直接用里面的API对某一段代码进行转化,但是大部分情况我们不会手动调用,可是这个包确实必须要用的,因为其它的包会用到它。
@babel/preset-env
它是多个preset的集合,并且不断在更新,我们可以通过配置项来决定需要支持的平台(浏览器或者node平台,不同版本下),然后按需加载插件,如果不配置,默认情况下和babel-preset-latest等同,会加载从es2015开始的所有preset
@babel/register
每当使用 require 命令加载 .js, .jsx, .es, .es6 的后缀名文件时,会先用babel进行转码。
使用时必须先加载 require('@babel/register'),这个通常我们会在做服务端编译的时候,引入这个。
@babel/polyfill

从7.4版本开始,不推荐使用了,下面讲一下原因:
babel默认只转换js语法,不转换新的API,比如 Iterator, Generator, Set, Maps, Proxy, Reflect, Symbol, Promise 等全局对象,以及一些定义在全局对象上的方法,比如 Array.from, Object.assign ,如果想用这些方法,就必须使用 @babel/polyfill ,它内部集成了 core-js, regenerator
使用时必须在所有代码运行之前加 require('@babel/polyfill'),所以之前通常也是在服务端代码中加入这个。
 
 
缺点:
打出来的包非常大,因为它是一个整体,会一次性将所有的方法都加到原型链上,没用到的那些方法也会加上去,所以可以单独使用 core-js 的某个类库来解决
会污染全局变量,因为直接在原型上做修改
如何解决这些缺点?使用 @babel/plugin-transform-runtime 和 @babel/runtime
@babel/plugin-transform-runtime 和 @babel/runtime
简单来说,它能有效的减少重复代码,并且可以实现在需要进行转换的时候才转换,不会像 @babel/polyfill 那样一次性全部处理
使用时必须将 @babel/runtime 添加到 dependencies 中
那这样的话,谁还用 @babel/polyfill 呢,是否有场景是必须要用它,而 @babel/runtime 解决不了的呢?
有, 实例方法无法转码,如
 
'!!!'.repeat(3);
'hello'.includes('h');

  

 

但是那都是过去了!

@babel/runtime-corejs3 里提供了对实例方法的转码,所以不用使用babel-polyfill,使用的时候在@babel/plugin-transform-runtime里配置属性 corejs: 3

 
 
 
以上就是我在学习babel过程中觉得有价值的部分了,可能面试会遇到的这些问题,如果后续还看到有用的内容,会继续更新。
 
end

Babel知识点相关的更多相关文章

  1. React-Native知识点相关

    React-Native相关 一,为什么要使用React-native? Hybrird的首屏时间太慢,白屏太久,影响用户体验: 原生native开发成本较高: 这里补充一点Webview的性能优化: ...

  2. Java最重要的21个技术点和知识点之JAVA基础

     (一)Java最重要的21个技术点和知识点之JAVA基础  写这篇文章的目的是想总结一下自己这么多年JAVA培训的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Ja ...

  3. Java最重要的21个技术点和知识点之JAVA面向对象

    (二)Java最重要的21个技术点和知识点之JAVA面向对象  写这篇文章的目的是想总结一下自己这么多年JAVA培训的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的J ...

  4. Java最重要的21个技术点和知识点之JAVA集合框架、异常类、IO

    (三)Java最重要的21个技术点和知识点之JAVA集合框架.异常类.IO  写这篇文章的目的是想总结一下自己这么多年JAVA培训的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享 ...

  5. Java最重要的21个技术点和知识点之JAVA多线程、时间处理、数据格式

    (四)Java最重要的21个技术点和知识点之JAVA多线程.时间处理.数据格式  写这篇文章的目的是想总结一下自己这么多年JAVA培训的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能 ...

  6. Java最重要的21个技术点和知识点

    (五)Java最重要的21个技术点和知识点之网络编程.泛型.编程规范相关 写这篇文章的目的是想总结一下自己这么多年JAVA培训的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚 ...

  7. 给Java新手的一些建议----Java知识点归纳(Java基础部分)

    写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,希望可以给 ...

  8. 95%的技术面试必考的JVM知识点都在这,另附加分思路!

    概述:知识点汇总 jvm的知识点汇总共6个大方向:内存模型.类加载机制.GC垃圾回收是比较重点的内容.性能调优部分偏重实际应用,重点突出实践能力.编译器优化和执行模式部分偏重理论基础,主要掌握知识点. ...

  9. 给Java新手的一些建议——Java知识点归纳(Java基础部分)

    原文出处:CSDN邓帅 写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些Java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行 ...

随机推荐

  1. dfs树

    dfs树是解决图中带环的利器. 前天CF的F题就是dfs树,但是当时我没有认真思考 觉着找到一个环过于困难 当时没有想到 也没理解dfs树的意义. 对于一张无向图求出一个dfs树 这个树有两种边 树边 ...

  2. Centos xrdp 远程连接后突然闪退

    问题描述: 可以进入登录页面,但是输入用户名,密码后,直接闪退. 查看 该用户名  ~/.xsession-errors imsettings-check: ): IMSettings-WARNING ...

  3. K近邻算法(一)

    K 近邻算法思想: 寻找该点周围最近的K个点.根据这K 个点的类别来判断该点的类别: 核心: 数据归一化.(在必要的时候必须进行数据归一化处理,防止某一特征在计算数据时占比较重) 计算欧拉距离 . 使 ...

  4. What is 测试金字塔?

    我的女朋友是一名测试工程师,但她之前却不知道测试金字塔的概念,为此我曾经在家里的白板上画了一个图一层一层给她讲解过.我和同事在给团队面试测试和开发岗位时,也会必问到这个问题,想到可能有很多开发童鞋都不 ...

  5. axios的post请求返回状态码400

    设置拦截 axios.interceptors.request.use((config) => { if (config.method === 'post') { if (!config.isF ...

  6. Java 循环语句及流程控制语句

    java循环语句while与do-while 一 while循环 while循环语句和选择结构if语句有些相似,都是根据条件判断来决定是否执行大括号内的执行语句. 区别在于,while语句会反复地进行 ...

  7. 2020-07-05:tcp和udp的区别和应用场景。如何实现断点续传?

    福哥答案2020-07-05: 区别:1.可靠性:tcp可靠.udp不可靠.2.连接性:tcp面向连接.udp无连接.3.报文:tcp字节流.udp面向报文.4.传输效率:tcp低.udp高.5.多点 ...

  8. C#算法设计查找篇之04-斐波那契查找

    斐波那契查找(Fibonacci Search) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/704 访问. 斐波那契 ...

  9. python 文件读写with open模式r,r+,w,w+,a,a+的区别

    模式 可做操作 若文件不存在 是否覆盖 r 只能读 报错 - r+ 可读可写 报错 是 w 只能写 创建 是 w+ 可读可写 创建 是 a 只能写 创建 否,追加写 a+ 可读可写 创建 否,追加写

  10. GaussDB基本操作

    列出所有数据库 \l 切换数据库 \c ${databaseName} 列出当前数据库下的表 \d 列出表的所有字段 \d ${tableName} 查看指定表的基本情况 \d+ ${tableNam ...