初步认识 Babel

news2024/10/6 22:29:42

Babel 官网:https://www.babeljs.cn/docs/

1.AST 抽象语法树

AST 抽象语法树,是 Babel 的核心

在 JavaScript 的世界中,你可以认为抽象语法树(AST)是最底层

下面会通过拆解一个普通函数,解释下什么是 AST 抽象语法树

如果想了解更多,推荐阅读这篇博客:https://segmentfault.com/a/1190000016231512

下面是一个 函数定义对象(FunctionDeclaration)

function add(a, b) {
    return a + b
}

  • 一个id,就是函数的名字,即add

  • 两个params,就是函数的参数,即 [a, b]

  • 一块body,就是函数大括号内的内容

add是一个标志对象(Identifier),无法继续拆解,是函数的唯一标志

{
    name: 'add'
    type: 'identifier'
    ...
}

params是两个标志对象(Identifier)组成的数组,无法继续拆解

[
    {
        name: 'a'
        type: 'identifier'
        ...
    },
    {
        name: 'b'
        type: 'identifier'
        ...
    }
]

body是一个 块状域对象(BlockStatement),用来表示 { return a + b },可以继续拆解

打开 块状域对象(BlockStatement),里面有一个Return域对象(ReturnStatement),用来表示return a + b,可以继续拆解

打开Return域对象(ReturnStatement),里面有一个二项式对象(BinaryExpression),用来表示 a + b,可以继续拆解

打开 二项式对象(BinaryExpression),它成了三部分,left,operator,right

  • operator 即+

  • left 里面装的,是Identifier对象 a

  • right 里面装的,是Identifer对象 b

综上所述,拆成了 AST 语法树

AST在线转换 https://astexplorer.net/#/

2.Babel 基本原理与作用

2.1 Babel 作用

Babel 是一个 JavaScript 编译器

它能将 新版本的代码 转换为 向后兼容(Polyfill)的JavaScript 代码,进而支持各个版本的浏览器

Babel 官网:https://www.babeljs.cn/docs/

2.2 Babel 处理流程

Babel 处理流程分为三个步骤:

  • parsing (解析) —— 通过babylon将js转化成AST抽象语法树

  • transforming (转换) —— 通过babel-traverse遍历AST,并转化成新的AST

  • generating (生成) —— 通过babel-generator把AST生成新的JavaScript代码

基本原理概述:

  • 将源码转成AST抽象语法树

  • 把AST处理成新的语法树

  • 将新语法树转换成JavaScript代码

3.配置Babel

3.1 单个软件包在 .babelrc 中配置

presets 预设:Babel 官方做了一些预设的插件集,称之为 Preset,我们只需要使用对应的 Preset 就可以了

plugin 插件:babel 和 webpack 类似,是通过插件进行代码转化的,如果不配置插件,babel 会原样返回代码

.babelrc {
  // presets 预设:Babel 官方做了一些预设的插件集,称之为 Preset,我们只需要使用对应的 Preset 就可以了
  "presets": [],
  // plugin 插件:babel 和 webpack 类似,是通过插件进行代码转化的,如果不配置插件,babel 会原样返回代码
  "plugins": []
}

3.2 Vue中,在babel.config.js中配置

配置babel-plugin-component插件,按需引入elementUI

参考 ElementUI 官方文档:https://element.eleme.io/#/zh-CN/component/quickstart

首先,安装 babel-plugin-component:

npm install babel-plugin-component -D

然后,将 .babelrc 修改为:

{
  "presets": [["es2015", { "modules": false }]],
   // 配置 babel-plugin-component 插件
  "plugins": [
    [
      "component",
      {
        "libraryName": "element-ui",
        "styleLibraryName": "theme-chalk"
      }
    ]
  ]
}

接下来,如果你只希望引入部分组件,比如 Button 和 Select,那么需要在 main.js 中写入以下内容:

import Vue from 'vue';
import { Button, Select } from 'element-ui';
import App from './App.vue';

Vue.component(Button.name, Button);
Vue.component(Select.name, Select);
/* 或写为
 * Vue.use(Button)
 * Vue.use(Select)
 */

new Vue({
  el: '#app',
  render: h => h(App)
});

3.3 配置browserslist

browserslist 用来控制要兼容浏览器版本

browserslist 配置的范围越具体,就越能精确控制Polyfill转化后的体积大小

"browserslist": [
   // 全球超过1%人使用的浏览器
   "> 1%",
   // 所有浏览器兼容到最后两个版本根据 CanIUse.com 追踪的版本
   "last 2 versions",
   // chrome 版本大于 70
   "chrome >= 70"  
   // 排除部分版本
   "not ie <= 8"
]

4.开发 Babel 插件

开发过程参考:https://www.jianshu.com/p/44c0075fd043

4.1 Babel 插件的作用

Babel插件担负着编译过程中的核心任务 —— 转换 AST

4.2 Babel 插件的基本格式

  • 一个函数,参数是babel,返回一个对象,key是visitor,里面的对象是一个箭头函数

  • 函数有两个参数,path表示路径,state表示状态

  • CallExpression就是我们要访问的节点,path 参数表示当前节点的位置,包含的主要是当前节点(node)内容以及父节点(parent)内容

module.exports = function (babel) {
  let t = babel.type
  return {
    visitor: {
      CallExression: (path, state) => {
        do soming
     }
    }
  }
}

4.3 实现将 const a 转换为 const b

4.3.1 创建babelPluginAtoB.js

module.exports = function (babel) {
  let t = babel.types;
  return {
    visitor: {
      VariableDeclarator(path, state) {
        // VariableDeclarator 是要找的变量声明
        if (path.node.id.name === "a") {
          // 方式一:直接修改 name
          path.node.id.name = 'b';
          // 方式二:把 id 是 a 的 ast 换成 b 的 ast
          // path.node.id = t.Identifier("b"); 
        }
      }
    }
  };
};

4.3.2 在 .babelrc 中引入 babelPluginAtoB 插件

const babelPluginAtoB = require('./babelPluginAtoB.js');
{
  "plugins": [
    [babelPluginAtoB]
  ]
}

4.3.3 编写测试代码

let a = 1;
console.log(b); 
// babel 插件生效,没有报错,打印 1

5.参考文档

https://juejin.cn/post/6844904008679686152#heading-17

https://www.ruanyifeng.com/blog/2016/01/babel.html

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

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

相关文章

node服务从http升级到https(阿里云免费ssl)

升级原因1.各大搜索引擎中&#xff0c;https的网页的权重比一般的http的网页权重要高。2.从用户体验的角度&#xff0c;一个老是被浏览器提醒该网页不可信的网页&#xff0c;总不会让用户感到安心所以将网站从http升级为https是很有必要的用户配置首先介绍一下这次升级的网站使…

拓扑排序 (算法思想+图解+模板+练习题)

拓扑排序 有向无环图一定是拓扑序列,有向有环图一定不是拓扑序列。 无向图没有拓扑序列。 首先我们先来解释一下什么是有向无环图&#xff1a; 有向就是我们两个结点之间的边是有方向的&#xff0c;无环的意思就是整个序列中没有几个结点通过边形成一个圆环。 下图就是一个…

数据分析:通俗易懂假设检验

导读 大多数关于假设检验的教程都是从先验分布假设开始&#xff0c;列出一些定义和公式&#xff0c;然后直接应用它们来解决问题。然而&#xff0c;在本教程[1]中&#xff0c;我们将从第一原则中学习。这将是一个示例驱动的教程&#xff0c;我们从一个基本示例开始&#xff0c;…

Web(五、六)

JavascriptDOM* 功能&#xff1a;控制html文档的内容* 获取页面标签(元素)对象&#xff1a;Element* document.getElementById("id值"):通过元素的id获取元素对象* 操作Element对象&#xff1a;1. 修改属性值&#xff1a;明确获取的对象是哪一个&#xff1f;查看API文…

BI工具将数据分析拉下神坛

以前&#xff0c;数据分析是一件比较有门槛的事&#xff0c;它不仅要求数据分析师具备一定的数据分析思维和方法经验&#xff0c;还要求数据分析师们熟练使用各种复杂的数据分析工具&#xff0c;要求他们掌握Python、R、SQL等。但随着BI工具的发展&#xff0c;多维自助分析逐渐…

组织机构管理不得不了解的 RBAC 权限模型|身份云研究院

由于信息安全越来越被重视&#xff0c;企业的身份管理已经成为市场焦点&#xff0c;对于实施企业级安全策略和身份管理的需求随之迅速上升。而作为权限访问控制策略的 RBAC&#xff08;基于角色的访问控制&#xff09;模型也已被广泛使用到组织机构管理中&#xff0c;本文将带领…

LeetCode刷题模版:81 - 90

目录 简介81. 搜索旋转排序数组 II82. 删除排序链表中的重复元素 II83. 删除排序链表中的重复元素84. 柱状图中最大的矩形85. 最大矩形86. 分隔链表87. 扰乱字符串【未理解】88. 合并两个有序数组89. 格雷编码90. 子集 II结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有…

vue组件中插槽slot的使用

目录 插槽 1、组件的三大核心&#xff1a;属性&#xff08;data、props&#xff09;、事件、插槽 2、插槽&#xff08;slot&#xff09;&#xff1a;将子组件和父组件进行组合&#xff0c;可以弥补视图的不足。使组件具有更好的扩展性 组件的封装方式&#xff1a;抽取共性、…

CMMI五大成熟度定义及过程管理类详解

一、成熟度级别CMMI组织的成熟度级别提供了描述其绩效特征的方式。经验表明&#xff0c;当组织每次过程改进工作所专注的过程域在数量上易管理时&#xff0c;组织能够做到最好&#xff1b;那些领域随着组织的改进&#xff0c;也需要不断成熟。成熟度级别是组织级过程改进的预定…

ADI边缘 AI MCU,助力从万物互联到万物智联

物联网被视为继计算机、互联网之后世界信息产业发展的第三次浪潮。据 IoT Analytics 在 2022 年 5月发布的《物联网现状 2022 年春季版》报告显示&#xff0c;2021 年全球物联网连接数量增长 8%&#xff0c;达到 122 亿个活跃端点&#xff1b;到 2022 年&#xff0c;物联网市场…

【KANO】需求管理模型

1.什么是Kano模型 Kano模型就是一个可以帮助我们有效识别“真伪需求”、划分需求优先级的有效工具。Kano模型是东京理工大学教授狩野纪昭&#xff08;Noriaki Kano&#xff09;发明的对用户需求分类和优先排序的有用工具&#xff0c;以分析用户需求对用户满意的影响为基础&…

【分享】原力计划的初衷 【探讨】新的一年,你对原力计划有哪些期待?

课前小差 哈喽&#xff0c;大家好&#xff0c;我是几何心凉&#xff0c;这是一份全新的专栏&#xff0c;唯一得倒CSDN王总的授权&#xff0c;来对于我们每周四的绿萝时间 ——【直达CSDN】直播内容进行总结概括&#xff0c;让大家能够省去看直播回放的时间也能够了解直播内容和…

JavaScript创建对象的方式

概述 JavaScript有多种创建对象的方式。 方式一&#xff1a;newfunction构造函数 function DogFactory(type, color) {this.type typethis.color color } // 方式一&#xff1a;new var dog new DogFactory(Dog, Black); console.log(dog) // new DogFactory(Dog, Black)…

jpeg压缩原理简述

一、色彩空间转换(RGB→YCrCb) 这一步没有数据删除&#xff0c;是可逆的步骤 YCbCr 是在世界数字组织视频标准研制过程中作为ITU - R BT1601 建议的一部分,其实是YUV经过缩放和偏移的翻版。其中Y与YUV 中的Y含义一致, Cb , Cr 同样都指色彩, 只是在表示方法上不同而已。在YUV家…

Android本地服务器NanoHttpd配置Https双向认证

一、 了解数字证书 在HTTPS的传输过程中&#xff0c;有一个非常关键的角色——数字证书&#xff0c;那什么是数字证书&#xff1f;又有什么作用呢&#xff1f; 所谓数字证书&#xff0c;是一种用于电脑的身份识别机制。由数字证书颁发机构&#xff08;CA&#xff09;对使用私…

超实用的办公小技巧,上班族必看

技巧一&#xff1a;使用“PS”来合并 这个方法大家是不是觉得有点出乎意料呢&#xff1f;虽然PS是一个图像处理的工具&#xff0c;但它总是有些我们想不到的功能。下面就给大家介绍一下究竟要怎么利用它来合并PDF文件。 使用感受&#xff1a;的确是可以合并多个PDF文件的&…

《啊哈算法》第二章栈,队列,链表(解析+代码)

从无到有学算法 吾日三省吾身&#xff0c;今天有写代码乎?&#x1f644; &#x1f644;抠门渣男语录&#xff1a;我的果汁分你一半&#xff08;月亮弯弯 绵绵绵绵缠缠&#xff09; - 李金源 - 单曲 - 网易云音乐 千年之后的你在哪里&#xff1a;星月神话 - 我觉得我还能再吃…

CACHE 概念

CACHE 概念 CPU 读写指令或者数据&#xff0c;可能直接从寄存器查取&#xff0c;也可能经过 TLB &#xff0c;经过 MMU&#xff0c;经过高速缓存&#xff0c;经过内存&#xff0c;经过外部存储器。这里面有一个 Cache 的概念&#xff0c;想多了解下了&#xff0c;于是有这这一…

【自定义类型】带你走进结构体、枚举、联合

欢迎来到小王学代码的博客 在字符型函数之后&#xff0c;我们接下来要学习的是自定义类型中的结构体、枚举、联合 目录 前言 一、结构体 1.1结构体的声明 1.2 特殊声明和结构自引用 1.4结构体的自引用 1.5结构体变量的定义和初始化 1.6 结构体内存对齐 1.7修改默认对齐…

【杂烩】Latex中的一些技巧备忘录

1. subfigure 和 minipage 环境的运用 首先是多张图组合到一起&#xff0c;左侧和下方备注列标题和行标题。 使用的时候需要的包&#xff1a; minipage不需要 \usepackage{subfigure} \usepackage{graphicx}代码1&#xff1a; \begin{figure*}[htbp]\centering%第一行图片展…