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

news2024/11/15 21:35:21

一、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

完!

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

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

相关文章

NLP实战:使用Word2vec实现文本分类

目录 一、数据预处理 1、加载数据 2. 构建词典 3.生成数据批次和迭代器 二、模型构建 1.搭建模型 2.初始化模型 3.定义训练与评估函数 三、训练模型 1. 拆分数据集并运行模型 2. 测试指定数据 &#x1f368; 本文为[&#x1f517;365天深度学习训练营]内部限免文章&…

设计模式篇---单例模式

文章目录 概念结构与实现优缺点 概念 单例模式是结构最简单的设计模式&#xff0c;通过单例模式可以保证在整个系统中的一个类只有一个实例&#xff0c;从而节约系统资源。举个例子&#xff0c;比如windows电脑下的任务管理器只能打开一个&#xff0c;这个就是单例模式&#x…

【C语言进阶】程序员必备技能之文件操作

目录 &#x1f945;什么是文件&#xff1a; &#x1f3d1;程序文件&#xff1a;&#x1f3d1;数据文件&#xff1a; &#x1f3d1;文件名&#xff1a; &#x1f945;文件的打开和关闭&#xff1a;&#x1f3d1;文件指针&#xff1a; &#x1f3d1;fopen和fclose&#xff1a; &a…

genlogic GLG -CE 4.3 For Java/C#/C++ Crack

GLG CE工具包是一个极其灵活和强大的图形框架&#xff0c;用于构建显示实时数据的可视化界面&#xff0c;例如过程控制和监控的操作员显示、SCADA / HMI模拟和图表、 交通、遥测和网络监控显示&#xff0c;以及其他任务关键应用程序。 航电仪表板演示 该工具包包括 用于创建动…

面向对象三大特征

面向对象三大特征 众所周知&#xff0c;面向对象有三大特征 封装继承多态 封装继承多态&#xff0c;就好像武侠小说里的“金、木、水、火、土”一样&#xff0c;相生相克 封装 封装就像是武侠里的金钟罩铁布衫&#xff0c;把对象的数据和方法封装起来&#xff0c;对外只暴露…

C语言strstr函数的使用和模拟实现

strstr 函数原型&#xff1a; char *strstr( const char *string, const char *strCharSet );const char *string 要搜索的字符串const char *strCharSet 子串char *strstr 返回第一个出现字串的起始地址&#xff0c;方便函数链式访问 函数作用&#xff1a; 在 string 字符串…

逻辑越权之验证码|token|接口(36)

token是类似于会话一串数字代表数据包的唯一性&#xff0c;数据包的编号&#xff0c;防止一些csrf&#xff0c;或者一些存放数据包的攻击&#xff1b;一般数据包里面有token&#xff0c;就会检验数据包的唯一性&#xff0c;就会造成提交数据包&#xff0c;被token拦截掉。 验证…

第八章 图像压缩

文章目录 第八章 图像压缩8.1基础知识8.1.1 编码冗余8.1.4图像信息的度量8.1.5保真准则8.1.6图像压缩模型8.17图像格式、容器和压缩标准 8.2一些基本的压缩方法8.2.1霍夫曼编码8.2.2Golomb编码8.2.3算术编码8.2.4LZW编码8.2.5行程编码8.2.6基于符号的编码8.2.7比特平面编码8.2.…

JVM调优常用的工具JPS、JMAP、JSTAT、JSTACK和JCMD的使用详解

查看PID信息 首先启动一个服务 使用jps 和 jps -l 的区别&#xff0c;使用jps -l 能够显示出服务的名称 熟悉JVM调优中常用的工具JMAP、JSTAT和JSTACK JMAP、JSTAT和JSTACK是Java开发中常用的工具&#xff0c;用于分析和调试Java应用程序。它们的使用场景如下&#xff1a; JMA…

S7 1200 CM1241组态modbus rtu

S7 1200 V4.5版本 CM1241 V2.0版本 1 一开始遇到问题 CM1241 绿色灯一直闪烁, PLC 显示LED红色错误 网上查找可能固件不匹配 我一开始选的V2.2 最后选到V2.0才行 如果CM1241 绿灯变为常亮, 这样才是正确组态 如果不是常亮,那么是没有输出的 2 程序 弄了M1.0来启动配置m…

K-means算法

文章目录 1. K-means算法简介2. K-means算法原理2.1 算法具体步骤2.2 k取值方法2.2.1 手肘法2.2.2 轮廓系数法 2.3 K-means2.4 算法终止条件 3. K-means算法特点4. K-means算法应用场景5. K-means算法的Python应用5.1 K-means算法的Python实现5.2 sklearn.cluster.Kmeans函数的…

【Linux】timerfd——定时器

文章目录 前言认识 timerfdAPI timerfdAPI clock 官方示例简单使用epoll实现 前言 在 Linux 系统编程中&#xff0c;使用 timerfd 实现定时器功能是一种更加可靠、高效、灵活的方式。本文是对 timerfd 的简单使用&#xff0c;不涉及太过深入知识&#xff0c;熟练掌握几个常用 …

该死的科斯定理和三条保命原则

* * * 原创&#xff1a;刘教链 * * * 号外&#xff1a;今天在“刘教链”公众号次条发表了《内参&#xff1a;美联储下半年加息时间表和路径》&#xff0c;一号两文无法直接链接&#xff0c;请大家点击公众号卡片进入文章列表打开阅读。星球会员可以直接打开知识星球或discord …

企业级微服务架构实战项目--xx优选3-mq+nacos+es实现上下架

一 nacosmqes实现上下架 1.1 架构图 1.2 工程结构 1.3 核心代码流程 1.3.1 请求product模块 2.修改数据库&#xff0c;推送rabbitmq中 1.3.2 rabbitmq的工具类 1.3.3 search模块中rabbit客户端订阅信息 1.监听器监听信息 2.调用相应的上下架方法 2.1 调用product模块&…

c#网编实验五--WCF和TCP消息通信实验

分别编写服务端和客户端程序&#xff0c;利用基于WCF的TCP技术&#xff0c;实现在线聊天功能&#xff0c;完成在线用户列表管理&#xff0c;消息发送、接收的功能。 在同一个解决方案中&#xff0c;分别编写服务端程序和客户端程序&#xff0c;利用TCP实现简单的群聊功能。 具…

【领域驱动设计专题】一文带领你透视DDD领域驱动模型的本质和设计原理分析指南(构建领域知识)

一文带领你透视DDD领域驱动模型的本质和设计原理分析指南 前提介绍传统的软件设计方案瀑布设计方法敏捷方法学敏捷方法学的问题和局限性 构建领域知识认识和了解领域内容实体模型介绍分析飞行计划路线(route)路线(route) 领域专家进行交流&#xff0c;相互交换知识挖掘出关键的…

一台服务器最大能支持多少条 TCP 连接

一、一台服务器最大能打开的文件数 1、限制参数 我们知道在Linux中一切皆文件&#xff0c;那么一台服务器最大能打开多少个文件呢&#xff1f;Linux上能打开的最大文件数量受三个参数影响&#xff0c;分别是&#xff1a; fs.file-max &#xff08;系统级别参数&#xff09;&a…

npm发布自己的包

按照上面流程操作

基于Echarts构建停车场数据可视化大屏

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

XSS—存储型xss

xss >跨站脚本攻击>前端代码注入>用户输入的数据会被当做前端代码执行。 原理&#xff1a;使用者提交的XSS代码被存储到服务器上的数据库里或页面或某个上传文件里&#xff0c;导致用户访问页面展示的内容时直接触发xss代码。 输入内容后直接在下方回显&#xff0c;回…