JS 介绍 Babel 的使用及 presets plugins 的概念

一、Babel 是什么

Bebal 可以帮助我们将新 JS 语法编译为可执行且兼容旧浏览器版本的一款编译工具。
举个例子,ES6(编译前):

const fn = () => {};

ES5(编译后):

var fn = function() {}

二、Babel 的应用场景

想体验新 JS 语法带来的便捷和可读性,又希望能够向下兼容?Babel 可以帮你做到。
不仅如此,Babel 还支持解析 TSJSX 等多种语法,给 ES6/7/8/9 Typescript、React / Vue3 JSX 等"语法糖"带来无限的可能。

三、Babel 的基本使用

3.1 准备工作

  1. 新建项目:babel-demo
  2. 初始化 npm
  3. 安装 Babel 相关依赖包

命令流程如下:

mkdir babel-demo && cd babel-demo && touch app.js
yarn init -y
yarn add @babel/core @babel/cli @babel/preset-env --dev

依赖包解释:

  • @babel/core 是 Babel 的编译核心工具。
  • @babel/cli 是 Babel 提供的脚手架,后面会用到并解释。
  • @babel/preset-env 集成了各种 plugin 插件,后面会用到并解释。

项目结构如下:
请添加图片描述

3.2 编译 JS

  1. 打开 app.js,添加如下代码:
const app = () => {
  const greeting = 'World' ?? 'Tony'
  console.log(`Hello,${greeting}`)
}
  1. babel-demo 终端执行 @babel/cli 提供的编译命令:
node_modules/.bin/babel app.js --out-dir lib

解释:–out-dir 表示编译的产物将会放到 lib 目录下。
如图:
. 请添加图片描述
代码与原来没有任何变化,这是因为我们还未配置任何 Babel 插件,所以 Babel 将原封不动输出。

  1. 指定 Babel 插件:
node_modules/.bin/babel app.js --out-dir lib --plugins=@babel/plugin-transform-arrow-functions

解释: --plugins 参数指定了 @babel/plugin-transform-arrow-functions 插件,该插件表示将 ES6 箭头函数转为 ES5。

结果:
请添加图片描述

你可能注意到 ?? 这个语法没有被转换,这是 ES2020 的语法,得借助另外一个插件来完成编译,这里就不演示了,留给大家一个小作业。

你可能好奇,@babel/plugin-transform-arrow-functions 插件不安装便能引用?这块后面会作解释。

3.3 编译 Vue 中的 JSX 语法

背景:Vue3 新增了 JSX 语法, 问题来了,Vue 怎样识别 JSX 语法?这还得得益于 Babel 提供的 @babel/plugin-syntax-jsx 插件,它可以分析 JSX 语法并导出 AST 树,但不负责 标签 转换工作,于是 Vue 在 @babel/plugin-syntax-jsx 的基础上新增了支持标签转换的 @vue/babel-preset-jsx 插件。

使用:

  1. 安装依赖:
yarn add @vue/babel-preset-jsx
  1. 调整 app.js 代码,改为 Vue JSX 写法:
const app = () => {
  const greeting = 'World' ?? 'Tony'
  return <div>
    {`Hello,${greeting}`}
  </div>
}
  1. 执行编译:
node_modules/.bin/babel app.js --out-dir lib --presets=@vue/babel-preset-jsx

解释:@vue/babel-preset-jsx 属于 presets ,得用 --presets 参数引入,可以临时理解为它也是 plugin,只是引用方式变了而已。

结果:
请添加图片描述
可以看到,成功将 <div> 标签转成 Vue 提供的 h 函数并传参(h = render )。

3.4 编译 React 中的 JSX 语法

背景:React 最大的特点就是提供了 JSX 写法,同时也是饱受争议的一个特点,这里不过多阐述。 React 也是基于 @babel/plugin-syntax-jsx 新增了 @babel/plugin-transform-react-jsx 插件,和 Vue 一样用来兼容标签的转换。

使用:

  1. 安装依赖:
yarn add @babel/plugin-transform-react-jsx --dev
  1. 调整 app.js 语法,改为 React JSX 语法:
const app = () => {
  const greeting = 'World' ?? 'Tony'
  return <div>
    {`Hello,${greeting}`}
  </div>
}

提示:写法跟 Vue JSX 没啥区别,只有编译结果有区别。

  1. 执行编译:
node_modules/.bin/babel app.js --out-dir lib --plugins=@babel/plugin-transform-react-jsx

结果:
请添加图片描述
还是那股熟悉的的配方,熟悉的味道~

四、Bebel 配置

每次编译都要用 --plugins--presets 指定插件太麻烦了,就像 Eslint/Typescript 那样,Babel 同样支持以配置文件的方式,只需在根目录下新建 babel.config.json 即可。

注意:如果你使用的 Babel 版本低于 v7.8.0,请用 babel.config.js 格式。

4.1 将上面的插件引入配置中

  1. @babel/plugin-transform-arrow-functions
// babel.config.json
{
	"plugins": [
    	["@babel/plugin-transform-arrow-functions"]
  	]
}
  1. @vue/babel-preset-jsx
// babel.config.json
{
  "presets": [
    ["@vue/babel-preset-jsx"]
  ],
  "plugins": [
    ["@babel/plugin-transform-arrow-functions"]
  ]
}
  1. 执行编译:
node_modules/.bin/babel app.js --out-dir lib

Babel 会自动寻找babel.config.json 文件,并引入里面的 presetsplugins

4.2 Presets vs Plugins

4.2.1 Presets

Presets 其实就是 内置了许多 plugins,仅此而已,比如一开始安装的 @babel/preset-env ,里面就集成了许多插件,其中包括我们上面提到的 @babel/plugin-transform-arrow-functions

这也是为什么我们一开始要先安装 @babel/preset-env 的原因,后续可直接通过 --plugins 引用 @babel/plugin-transform-arrow-functions

类似的,React 和 Vue 也封装了自己的一套 presets,比如 @vue/babel-preset-app,里面内置了许多插件,其中就包括上面的 @babel/plugin-transform-arrow-functions/ @babel/plugin-transform-arrow-functions / @babel/preset-env 等等。我们没有直接用它的原因是为了让案例更易于理解,避免被 presets 名词给混淆了。

明白了 presets 的作用后,我们便可直接安装 @vue/babel-preset-app,并配置在 babel.config.json 中,像往常一样执行编译命令便可。

4.2.2 Plugins

说完 presets,再来聊聊 plugins,它实际上就是一个存放单个的 plugin 的集合,
也就是说,如果你想单独用某个插件而不用整套 preset,就可以通过 plugins 来单独地引入这个插件。

五、扩展知识

5.1 babel-loader 是什么?

如果想在 webapck 使用 babel,就得借助 babel-loader 来完成与 webpack 配合完成。
一个负责打包,一个负责编译。

5.2 Vue-cli 也能配置 babel ?

vue-cli 脚手架是基于 webpack 改造的,并提供了 vue-config.js 配置文件,里面就有一个transpileDependencies 属性可以改变 babel 的编译范围,让 babel 是否编译 node_modules/ 的代码。一般情况下,vue-config.js 能够配置 babel 的属性非常少,基本都是新建一个 babel.config.json 来维护,vue-cli 在执行时会读取这份配置并合并。

六、Bebel 部分插件说明

  • @babel/core Babel 的编译核心逻辑。

  • @babel/cli Babel 的执行脚手架。

  • @babel/plugin-syntax-jsx 识别 JSX 并提供 AST 分析语法树,但不会做转换工作。

  • @babel/preset-env 集成了大量的 plugins ,其中包括但不限于:

    • @babel/plugin-transform-optional-chaining 链式语法。
    • @babel/plugin-transform-arrow-functions ES6 箭头语法转换 ES5 。
    • @babel/plugin-transform-block-scoping let/const 语法转换 var 。
    • @babel/plugin-transform-classes class 语法转换。
    • @babel/plugin-transform-destructuring 解构对象转换。
    • 等等
  • @babel/preset-react 集成了有关 React 的 plugins,以下包括:

    • @babel/plugin-transform-react-jsx 支持 JSX & 标签转换。
    • 内嵌了 Babel 自带的如:@babel/preset-env / @babel/plugin-syntax-jsx 等。
  • @vue/babel-preset-app 集成了有关 Vue 的 plugins,以下包括:

    • @vue/babel-preset-jsx 支持 JSX & 标签转换。
    • 内嵌了 Babel 自带的如:@babel/preset-env / @babel/plugin-syntax-jsx 等。
  • @babel/preset-typescript 集成了关于 TS 的 plugins,以下包括:

    • @babel/plugin-transform-typescript 识别 TS 语法。

更多插件可参考:https://babeljs.io/docs/presets

完!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式-抽象工厂模式

抽象工厂模式 1、抽象工厂模式简介2、具体实现 1、抽象工厂模式简介 抽象工厂模式(Abstract Factory Pattern)在工厂模式尚添加了一个创建不同工厂的抽象接口(抽象类或接口实现)&#xff0c;该接口可叫做超级工厂。在使用过程中&#xff0c;我们首先通过抽象接口创建不同的工厂…

【HTML界面设计(二)】说说模块、登录界面

记录很早之前写的前端界面&#xff08;具体时间有点久远&#xff09; 一、说说模板 采用 适配器&#xff08;Adapter&#xff09;原理 来设计这款说说模板&#xff0c;首先看一下完整效果 这是demo样图&#xff0c;需要通过业务需求进行修改的部分 这一部分&#xff0c;就是dem…

Redis系列--布隆过滤器(Bloom Filter)

一、前言 在实际开发中&#xff0c;会遇到很多要判断一个元素是否在某个集合中的业务场景&#xff0c;类似于垃圾邮件的识别&#xff0c;恶意ip地址的访问&#xff0c;缓存穿透等情况。类似于缓存穿透这种情况&#xff0c;有许多的解决方法&#xff0c;如&#xff1a;redis存储…

宏景eHR SQL注入漏洞复现(CNVD-2023-08743)

0x01 产品简介 宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合&#xff0c;满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景eHR 存在SQL注入漏洞&#xff0c;未经过身份认证的远程攻击者可利用此漏洞执行任意SQL指令&#xff0c;从而窃取数…

如何在大规模服务中迁移缓存

当您启动初始服务时&#xff0c;通常会过度设计以考虑大量流量。但是&#xff0c;当您的服务达到爆炸式增长阶段&#xff0c;或者如果您的服务请求和处理大量流量时&#xff0c;您将需要重新考虑您的架构以适应它。糟糕的系统设计导致难以扩展或无法满足处理大量流量的需求&…

docker基础

文章目录 通过Vagrant安装虚拟机修改虚拟机网络配置 docker CE安装(在linux上)docker desktop安装(在MacOS上)Docker架构关于-阿里云镜像加速服务配置centos卸载docker 官网: http://www.docker.com 仓库: https://hub.docker.com Docker安装在虚拟机上&#xff0c;可以通过V…

Go语言的TCP和HTTP网络服务基础

目录 【TCP Socket 编程模型】 Socket读操作 【HTTP网络服务】 HTTP客户端 HTTP服务端 TCP/IP 网络模型实现了两种传输层协议&#xff1a;TCP 和 UDP&#xff0c;其中TCP 是面向连接的流协议&#xff0c;为通信的两端提供稳定可靠的数据传输服务&#xff1b;UDP 提供了一种…

[MySQL]不就是SQL语句

前言 本期主要的学习目标是SQl语句中的DDL和DML实现对数据库的操作和增删改功能&#xff0c;学习完本章节之后需要对SQL语句手到擒来。 1.SQL语句基本介绍 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系型数据库的编程语言。它允许用户在数据库中存…

双因素身份验证在远程访问中的重要性

在快速发展的数字环境中&#xff0c;远程访问计算机和其他设备已成为企业运营的必要条件。无论是在家庭办公室运营的小型初创公司&#xff0c;还是团队分散在全球各地的跨国公司&#xff0c;远程访问解决方案都能保证工作效率和连接性&#xff0c;能够跨越距离和时间的阻碍。 …

7Z045 引脚功能详解

本文针对7Z045芯片&#xff0c;详细讲解硬件设计需要注意的技术点&#xff0c;可以作为设计和检查时候的参考文件。问了方便实用&#xff0c;按照Bank顺序排列&#xff0c;包含配置Bank、HR Bank、HP Bank、GTX Bank、供电引脚等。 参考文档包括&#xff1a; ds191-XC7Z030-X…

怎么计算 flex-shrink 的缩放尺寸

计算公式: 子元素的宽度 - (子元素的宽度的总和 - 父盒子的宽度) * (某个元素的flex-shrink / flex-shrink总和) 面试问题是这样的下面 left 和 right 的宽度分别是多少 * {padding: 0;margin: 0;}.container {width: 500px;height: 300px;display: flex;}.left {width: 500px…

红日靶场(一)外网到内网速通

红日靶场&#xff08;一&#xff09; 下载地址&#xff1a;http://vulnstack.qiyuanxuetang.net/vuln/detail/2/ win7:双网卡机器 win2003:域内机器 win2008域控 web阶段 访问目标机器 先进行一波信息收集&#xff0c;扫一下端口和目录 扫到phpmyadmin&#xff0c;还有一堆…

【资料分享】Xilinx Zynq-7010/7020工业核心板规格书(双核ARM Cortex-A9 + FPGA,主频766MHz)

1 核心板简介 创龙科技SOM-TLZ7x是一款基于Xilinx Zynq-7000系列XC7Z010/XC7Z020高性能低功耗处理器设计的异构多核SoC工业核心板&#xff0c;处理器集成PS端双核ARM Cortex-A9 PL端Artix-7架构28nm可编程逻辑资源&#xff0c;通过工业级B2B连接器引出千兆网口、USB、CAN、UA…

Triton教程 --- 动态批处理

Triton教程 — 动态批处理 Triton系列教程: 快速开始利用Triton部署你自己的模型Triton架构模型仓库存储代理模型设置优化动态批处理 Triton 提供了动态批处理功能&#xff0c;将多个请求组合在一起执行同一模型以提供更大的吞吐量。 默认情况下&#xff0c;只有当每个输入在…

【开源与项目实战:开源实战】81 | 开源实战三(上):借Google Guava学习发现和开发通用功能模块

上几节课&#xff0c;我们拿 Unix 这个超级大型开源软件的开发作为引子&#xff0c;从代码设计编写和研发管理两个角度&#xff0c;讲了如何应对大型复杂项目的开发。接下来&#xff0c;我们再讲一下 Google 开源的 Java 开发库 Google Guava。 Google Guava 是一个非常成功、…

io.netty学习(十一)Reactor 模型

目录 前言 传统服务的设计模型 NIO 分发模型 Reactor 模型 1、Reactor 处理请求的流程 2、Reactor 三种角色 单Reactor 单线程模型 1、消息处理流程 2、缺点 单Reactor 多线程模型 1、消息处理流程 2、缺点 主从Reactor 多线程模型 主从Reactor 多线程模型示例 1…

CTF-Show密码学:ZIP文件密码破解【暴力破解】

萌新 隐写23 题目内容&#xff1a; 文件的主人喜欢用生日做密码&#xff0c;而且还是个90后。 一、已知条件 在这个题目中&#xff0c;我们有以下已知条件&#xff1a; 文件的主人喜欢用生日做密码 - 这个条件告诉我们&#xff0c;密码可能是一个八位的纯数字密码&#xff0c…

云原生之深入解析如何正确计算Kubernetes容器CPU使用率

一、简介说明 使用 Prometheus 配置 kubernetes 环境中 Container 的 CPU 使用率时&#xff0c;会经常遇到 CPU 使用超出 100%&#xff0c;现在来分析一下&#xff1a; container_spec_cpu_period&#xff1a;当对容器进行 CPU 限制时&#xff0c;CFS 调度的时间窗口&#xff…

[架构之路-214]- UML-类图图解、详解、结构化、本质化讲解

目录 一、什么是类 1.1 概述 1.2 UML中类的表示 1.3 接口 1.4 抽象类 1.5 模板类 二、什么类图 2.1 概述 2.2 类关系 三、UML类图 3.1 结构关系 3.1.1 完全一体&#xff1a;继承关系 &#xff08;类与类耦合度最高&#xff0c;类与类之间最强的关系&#xff09; …

计算机基础知识

参考链接&#xff1a;https://blog.csdn.net/ChineseSoftware/article/details/123176978 https://www.cnblogs.com/8023-CHD/p/11067141.html https://blog.csdn.net/qq_42033567/article/details/108088514 http与https的区别 HTTP 的URL以http:// 开头&#xff0c;而HTTPS…