浅谈babel原理

news2024/9/21 12:38:02

1. babel简介

Babel 的前身是 6to5,6to5 是 2014 年 发布的,主要功能是 就是 ES6 转成 ES5。后改名babel。

2. Babel用途

  • 转译 esnext、typescript 等到目标环境支持的 js
    高级语言到到低级语言叫编译,高级语言到高级语言叫转译
  • 代码转换
    taro就是用babel做语法转译的。
  • 代码分析
    模块分析、tree-shaking 、 代码压缩、linter等

3. Babel怎么转译代码的?

在这里插入图片描述

对源码字符串进行 parse,生成 AST,把对代码的修改转为对 AST 的增删改,转换完 AST 之后再打印成目标代码字符串。

  • parse 阶段使用@babel/parser,作用是把源码转成 AST

    require('@babel/parser').parse(source, {
    	
    	sourceType: 'module',
    	
    	plugins: ['jsx', 'flow', 'classProperties', 'decorator', 'decorators-legacy'],
    	
    	});
    

    plugins: 指定jsx、typescript、flow 等插件来解析对应的语法。
    sourceType: module、script、unambiguous 3个取值,module 是解析 es module 语法。

  • transform 阶段使用 @babel/traverse,可以遍历 AST,并调用 visitor 函数修改 AST,修改 AST 涉及到 AST 的判断、创建、修改等,这时候就需要 @babel/types 了,当需要批量创建 AST 的时候可以使用 @babel/template 来简化 AST 创建逻辑。

    require('@babel/traverse').default
    
    function traverse(ast,vistor)
    
    //vistor可以是函数可以是对象,函数就是enter节点时调用的函数vistor名字为节点名称,对象就是enter和exit调用的函数。tips多个节点可以'FunctionDeclaration|VariableDeclaration'
    
    
    
    require('@babel/traverse').default(ast, {
    
    Program(path,state) {
    
    }
    
    })
    
    
    
    // path api
    
    {
    
    "parent": {...},
    
    "node": {...},
    
    "hub": {...},
    
    "contexts": [],
    
    "data": {},
    
    "shouldSkip": false,
    
    "shouldStop": false,
    
    "removed": false,
    
    "state": null,
    
    "opts": null,
    
    "skipKeys": null,
    
    "parentPath": null,
    
    "context": null,
    
    "container": null,
    
    "listKey": null,
    
    "inList": false,
    
    "parentKey": null,
    
    "key": null,
    
    "scope": null,
    
    "type": null,
    
    "typeAnnotation": null,
    
    get(key)
    
    set(key, node)
    
    inList()
    
    getSibling(key)
    
    getNextSibling()
    
    getPrevSibling()
    
    getAllPrevSiblings()
    
    getAllNextSiblings()
    
    isXxx(opts)
    
    assertXxx(opts)
    
    find(callback)
    
    findParent(callback)
    
    insertBefore(nodes)
    
    insertAfter(nodes)
    
    replaceWith(replacement)
    
    replaceWithMultiple(nodes)
    
    replaceWithSourceString(replacement)
    
    remove()
    
    traverse(visitor, state)
    
    skip()
    
    stop()
    
    }
    

@babel/types 用于创建、判断 AST 节点,提供了 xxx、isXxx、assertXxx 的 api

  • generate 阶段会把 AST 打印为目标代码字符串,同时生成 sourcemap,需要 @babel/generate包,中途遇到错误想打印代码位置的时候,使用@babel/code-frame

    const { code,map } = generator(ast, { sourceMaps: true });
    	
    	//设置sourceMaps为true才有sourceMaps
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/383882.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL 上亿大表如何优化?

背景XX 实例(一主一从)xxx 告警中每天凌晨在报 SLA 报警,该报警的意思是存在一定的主从延迟。(若在此时发生主从切换,需要长时间才可以完成切换,要追延迟来保证主从数据的一致性)XX 实例的慢查询…

李群李代数求导-常用求导公式

参考 A micro Lie theory for state estimation in robotics manif issues 116 常用求导公式 Operation左雅克比右雅克比X−1\mathcal{X}^{-1}X−1JXX−1−I\mathbf{J}_{\mathcal{X}}^{\mathcal{X}^{-1}}\mathbf{-I}JXX−1​−IJXX−1−AdX\mathbf{J}_{\mathcal{X}}^{\mathc…

Go中sync 包的 Cond 使用

文章目录背景Cond 简介使用示例Signal的使用场景Broadcast的使用场景注意事项背景 编写代码过程中, 通常有多个主协程和多个子协程进行协作的过程,比如通过 WaitGroup 可以实现当所有子协程完成之后, 主协程再继续执行, 具体可参…

【ns-3】VS Code开发环境配置

文章目录前言1. 安装VS Code2. 安装CMake和C插件3. 配置环境3.1 配置代码智能提示3.2 配置build3.3 配置gdb调试后记参考文献前言 正所谓“工欲善其事必先利其器”,本篇总结一下ns-3在VS Code开发环境下的配置。 版本信息如下: Ubuntu 22.10ns-3.37VS…

用户难增,广告营收下跌,微博还能“高飞”吗?

微博2022年的业绩再次“变脸”。 图源:微博 2023年3月1日,微博公布了2022年Q4及全年财报。2022年营收18.4亿美元,剔除汇率因素同比下跌15%;2022年Q2以来,微博坚持降本增效策略,提升了运营效率,…

Jquery实现增删改除

文章目录一.关于增加部分区别:二.关于删除部分关于在表格中实现增删改1.首先我们需要创建基本的HTML项目2.相关的css和js的引用3.呈上源代码(1).HTML源代码(2).js源代码(自己创建的)3.效果图&am…

大数据技术——Scala语言基础

Scala基础知识控制结构if条件表达式有一点与Java不同的是&#xff0c;Scala中的if表达式的值可以赋值给变量while循环for循环基本语法其中,“变量<-表达式”被称为“生成器(generator).”“守卫(guard)"的表达式:过滤出一些满足条件的结果。基本语法:for (变量<-表达…

Sandstorm 建设者亮点——2023 年 2 月

隆重推出 Sandstorm 建设者亮点——2023 年 2 月版&#xff0c;这是由最厉害的 Sandstorm 社区制作的独一无二的 NFT 系列。 从突破性的兔子机器人到神奇的蒸汽朋克海盗船&#xff0c;Sandstorm 建设者亮点 NFT 系列展示了一系列独一无二的创作。 19 项新资产将添加至 Sandstor…

提升内部客户服务的 13 个最佳实践攻略!

客户服务包含两个方面的内容&#xff1a;一个是内部服务&#xff1b;一个是外部服务。每一个企业在发展过程中都有内部客户和外部客户&#xff0c;内部服务是针对内部客户的&#xff0c;自己公司的部门与部门之间互为内部客户&#xff1b;外部服务是针对公司之外的外部客户的。…

MySQL数据库存储引擎【InnoDB/MyISAM/MEMORY 】

1.InnoDB存储引擎InnoDB给MySQL的表提供了事务处理、回滚、崩溃修复能力和多版本并发控制的事务安全。在MySQL从3.23.34a开始包含InnnoDB。它是MySQL上第一个提供外键约束的表引擎。而且InnoDB对事务处理的能力&#xff0c;也是其他存储引擎不能比拟的。靠后版本的MySQL的默认存…

你没用过工业智能网关?它已经在远程监控行业很热门了,足不出户远程控制设备。

一、项目背景 钢铁企业作为一个能量消耗比较大&#xff0c;污水排放比较多的工业&#xff0c;只有对技术进行不断的改革才能够实现节能减排的目的。这就需要相应的钢铁企业厂能够应用新的技术&#xff0c;实现污水的安全无污染处理&#xff0c;不断地改善环境&#xff0c;提高相…

卡特兰数及常见模型

卡特兰数 英文名Catalan number&#xff0c; 是组合数学中一个常出现在各种计数问题中出现的数列。其前几项为: 1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440 9694845 35357670 129644790 477638700 1767263190 6564120420 24466267020 91482563640 343…

苹果电脑怎么截屏?图文教学,包教包会

苹果电脑是很多设计师和程序员们所钟爱的电脑品牌&#xff0c;但是在使用过程中&#xff0c;有些小功能操作并不是那么容易掌握。比如&#xff0c;苹果电脑怎么截屏呢&#xff1f;如果您是新手&#xff0c;可能会感到有些困惑。别担心&#xff0c;下面我们将为您详细介绍如何在…

springboot整合minio及工具类

说明&#xff1a;本文章是springboot和minio的整合&#xff0c;同时还有上传和下载工具类&#xff0c;minio的具体介绍这里就不多说了【上传和下载都是基础工具类&#xff0c; minio的安装如果有时间就更新】 工程图&#xff1a;【主要功能在于工具类&#xff0c;在代码块11和…

好意外,发现永久免费使用的云服务器

原因就不说了&#xff0c;说一下过程&#xff0c;在百度搜pythonIDE的时候&#xff0c;发现了一个网站 https://lightly.teamcode.com/https://lightly.teamcode.com/ 就是这个网站&#xff0c;看见这个免费试用&#xff0c;一开始觉得没什么&#xff0c;在尝试使用的过程中发…

IIC总线式驱动开发(mpu6050)(二)

目录 六、I2C总线二级外设驱动开发方法 七、I2C总线二级外设驱动开发之名称匹配 1. i2c_register_board_info 2. i2c_new_device&#xff1a;明确二级外设地址的情况下可用 3. i2c_new_probed_device 八、I2C总线二级外设驱动开发之设备树匹配 六、I2C总线二级外设驱动开…

AVL树(Insert)

文章目录AVL树代码模拟实现Insert重点控制平衡:旋转->平衡右单旋左单旋左右双旋双旋平衡因子更新错误右左双旋左右双旋erase了解AVL树的性能AVL树 代码 高度平衡二叉搜索树 引入 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单…

C/C++网络编程笔记Socket

https://www.bilibili.com/video/BV11Z4y157RY/?vd_sourced0030c72c95e04a14c5614c1c0e6159b上面链接是B站的博主教程&#xff0c;源代码来自上面视频&#xff0c;侵删&#xff0c;这里只是做笔记&#xff0c;以供复习和分享。上一篇博客我记录了配置环境并且跑通了&#xff0…

从头开始搭建一个SpringBoot项目--SpringBoot文件的上传与下载

从头开始搭建一个SpringBoot项目--SpringBoot文件的上传前言流程分析代码结构代码详情UploadFileInfo.classUploadController.classUploadDao.classUploadDao.xmlUploadServices.classUploadServicesImpl.class测试下载示例前言 文件的上传和下载是很多系统必备的功能&#xf…

pytorch-复现经典深度学习模型-LeNet5

Neural Networks 使用torch.nn包来构建神经网络。nn包依赖autograd包来定义模型并求导。 一个nn.Module包含各个层和一个forward(input)方法&#xff0c;该方法返回output。 一个简单的前馈神经网络&#xff0c;它接受一个输入&#xff0c;然后一层接着一层地传递&#xff0c;…