[Babel] Intro Babel - 04. Plugins and Presets

news/2025/2/16 12:48:39/文章来源:https://www.cnblogs.com/Answer1215/p/18675744

使用插件

在 babel 要使用一个插件,步骤实际上非常简单,就分为两步:

  • 安装插件
  • 在配置文件或者 CLI 中指定插件

举个例子,例如有一个专门将箭头函数转为普通函数的插件:

pnpm add @babel/plugin-transform-arrow-functions -D

之后在配置文件中进行插件配置即可

{"plugins": ["@babel/plugin-transform-arrow-functions"]
}

插件使用的细节

  1. 插件的运行顺序

plugins 对应的值为一个数组,说明是可以指定多个插件的

{"plugins": ["transform-decorators-legacy", "transform-class-properties"]
}

在上面的配置中,插件的运行会从左往右运行,也就是说,会先运行 transform-decorators-legacy 这个插件,然后运行 transform-class-properties 这个插件。

如果配置文件中既配置了插件,又配置了预设,那么 babel 会先运行插件,然后在运行预设里面的插件,也就是说,插件运行的时机是要早于预设的。

  1. 插件选项

在使用插件的时候,是可以传递插件选项的,例如有三种写法:

{"plugins": ["pluginA", ["pluginA"], ["pluginA", {}]]
}

上面的三种写法目前来讲是等价的,而第三种写法,数组第二项的对象实际上就是用来传递插件配置项

{"plugins": [["transform-async-to-module-method",{"module": "bluebird","method": "coroutine"}]]
}

关于插件究竟有哪些配置项,这个需要去参阅插件相关的文档。

插件列表

你可以在 https://babeljs.io/docs/plugins-list 看到 babel 中支持的大多数插件。

一般来讲,每个插件点击进去会包含该插件对应的说明信息,一般包含这些内容:

  • 该插件的说明
  • 插件编译前后代码的区别
  • 该插件的使用方法
  • 该插件的配置选项

使用预设

预设的基本使用

首先第一步仍然是先要安装对应的预设

pnpm add --save-dev @babel/preset-env

安装完成后,在配置文件中进行配置:

{"presets": ["@babel/preset-env"]
}

预设对应的值是一个数组,说明也是能够配置多个预设的,但是一定要注意顺序

{"presets": ["@babel/preset-env", "@babel/preset-react"]
}

上面的配置中,会先运行 @babel/preset-react 预设里面的插件,然后运行 @babel/preset-env 这套预设里面的插件。

运行的顺序刚好和插件是相反的,从后往前运行。

官方预设

官方提供了 4 套预设:

  • @babel/preset-env 用于编译 ES2015 及以上版本的语法
  • @babel/preset-typescript 用于 TypeScript
  • @babel/preset-react 用于 React
  • @babel/preset-flow 用于 Flow

stage-x 预设

在 babel v7.0.0 之前,支持一种叫做 state-x 的预设特性。

JavaScript 的新特性是由 TC39 的小组提出并且通过一系列的阶段来推动的。一般来讲,这个阶段分为从 0 到 4,每个阶段对应了新特性的不同状态:

  • Stage 0 - Strawman:只是一个想法或者提案,还没有任何实现。
  • Stage 1 - Proposal:这是一个正式的提案,包含 API 的描述,但可能还没有完全实现。
  • Stage 2 - Draft:初步版本,已经有了初步的规范文本,并且大部分细节都已经确定。
  • Stage 3 - Candidate:候选阶段,规范已经完成,并且已经完成了浏览器的初步实现,这个阶段主要是为了获取反馈和评估。
  • Stage 4 - Finished:完成阶段,已经在多个浏览器中实现并通过了实际使用的测试,可以被添加到 ECMAScript 标准中。

在早期的时候(babel v7.x.x 之前),可以安装对应阶段的预设

npm install --save-dev @babel/preset-stage-2

这个预设对应了 stage2 阶段的新特性的编译

{"presets": ["@babel/preset-stage-2"]
}

之后你在做开发的时候,就可以只用 stage 2 阶段的新语法了。

但是上面的 stage-x 的预设从 v7.0.0 版本开始就已经废弃了。

As of Babel 7, we've decided to deprecate the Stage-X presets and stop publishing them. Because these proposals are inherently subject to change, it seems better to ask users to specify individual proposals as plugins vs. a catch all preset that you would need to check up on anyway.

目前官方推荐的做法是要使用哪个新特性,直接安装对应的插件即可。

@babel/preset-env

这里我们主要看一下这一套插件对应的 options

{"presets": [["@babel/preset-env",{"useBuiltIns": "entry","corejs": "3.22","modules": false}]]
}

在上面的配置中,我们就使用了 @babel/preset-env 预设,并且对这套预设做了一些配置。

  • targets:指定浏览器需要支持的版本范围
{"presets": [["@babel/preset-env", {"targets": "> 0.25%, not dead"}]]
}
  • useBuiltIns:让你决定如何使用 polyfills

    • entry:该选项值会根据项目中 browserslist 对应的浏览器版本范围来添加 polyfills,这个选项不会管你源码中是否用到缺失的特性,只要对应的浏览器版本是缺失的,那么就会添加对应的特性。而且在使用这个选项值的时候,还需要在源码的入口文件中手动引入 core-js
    • usage:根据你的源码中是否使用了缺失的特性,如果使用到了缺失的特性,那么才添加对应的 polyfills
    • false:这个是默认值,关闭自动引入 polyfills。
  • corejs:指定你的 corejs 版本,polyfills 实际上就是通过 corejs 来实现的。该配置项一般就和 useBuiltIns 一起使用

{"presets": [["@babel/preset-env", {"useBuiltIns": "usage","corejs": 3}]]
}
  • corejs 支持的配置项有 2、3 还有 false:

-- "2": 使用 core-js 的版本 2。这是旧版本的 core-js,它包含 ES5、ES6ES7 的特性。在 Babel 7.4.0 之前,这是默认值。

-- "3": 使用 core-js 的版本 3。这是新版本的 core-js,它包含 ES5、ES6、ES7、ES8 和更高版本的特性。在 Babel 7.4.0 及更高版本,这是推荐的值。

-- false: 不使用 core-js。如果你不想让 Babel 添加任何 polyfill,你可以将 corejs 设置为 false

  • modules:设置模块的类型
    • amd
    • umd
    • systemjs
    • commonjs
    • cjs
    • auto
    • false

默认值为 auto,根据你的环境和代码自动来决定使用的模块版本。

  • include:允许你显式的指定要包含的插件(这个插件是本身在预设里面,但是因为 targets 的设置,可能会被排除掉)
{"presets": [["@babel/preset-env", {"targets": "> 0.25%, not dead","include": ["@babel/plugin-proposal-optional-chaining"]}]]
}

假设 preset-env 里面有 pluginA、pluginB、pluginC,假设我现在指定了浏览器范围,所指定的这些浏览器范围已经实现了特性 A 和 特性B,那么这里就只会用到 pluginC。那么 include 配置项就可以强行指定要包含的插件

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Babel] Intro Babel - 01 Introduction

Babel介绍 Babel 是一个编译器,主要用于将最新的 JavaScript 代码转化为向后兼容的代码,以便在老版本的浏览器或环境中运行。 例如,你可能在开发时使用了 ES6、ES7 或者更高级的 JavaScript 特性,但是有些浏览器可能并不支持这些新特性,这时就可以用 Babel 来将代码转化为…

Babel Intro Babel - 01 Introduction

Babel介绍 Babel 是一个编译器,主要用于将最新的 JavaScript 代码转化为向后兼容的代码,以便在老版本的浏览器或环境中运行。 例如,你可能在开发时使用了 ES6、ES7 或者更高级的 JavaScript 特性,但是有些浏览器可能并不支持这些新特性,这时就可以用 Babel 来将代码转化为…

unordered_map-STL容器

时间复杂度和空间复杂度

2 应用层

2 应用层 2.1 网络应用原理 网络应用:能够运行在不同的端系统和通过网络彼此通信的程序。注:在端系统上运行,而不是在网络核心上运行。网络应用是计算机网络存在的理由。 2.1.1 应用体系结构(application architecture) 客户-服务器体系结构(client-server architecture)…

【内网穿透】概念、原理与实现方法

一、内网穿透简介 内网穿透是一种网络技术,它允许外部网络(如互联网)上的设备访问位于内部网络(例如公司或家庭局域网LAN)中没有直接公网IP地址的设备。这对于远程办公、云服务接入以及物联网设备管理等场景至关重要。 二、工作原理 内网穿透主要依赖于NAT(网络地址转换)…

数字电路课程笔记

1、数制与码制 补零 二进制和十六进制之间的转换: 整数部分:对于整数部分,您需要将二进制数从右往左,每四位一组。如果剩余的位数不足四位,就需要在左边补零,直到每组都有四位。小数部分:对于小数部分,您需要将二进制数从左往右,每四位一组。如果剩余的位数不足四位,…

unity里生成的.csproj和.sln :assembly definition

有一段时间一直没明白为啥有的时候第三方的package里的代码没法引用我们项目的,最近有点心得,记录下: 在创建unity项目的时候默认是创建一个解决方案就是以.sln为结尾的。默认开发时都在同一个解决项目里,所以不会出现相互引用不到的问题。当我们引用到第三方的package时就…

【前端框架】2025 React 状态管理终极指南!

全文约 10800 字,预计阅读需要 30分钟。 React 作为当下最受欢迎的前端框架,在构建复杂且交互丰富的应用时,状态管理无疑是至关重要的一环。从简单的本地状态,到能让多个组件协同工作的全局状态,再到涉及服务器通信、导航切换、表单操作以及持久化存储等不同场景下的状态管…

【搜索】多源BFS专题

跳马(多源BFS变种,每个起点有步数限制)补充几个测试样例 输入 3 2 . . 2 . . .输出 0输入 3 5 4 7 . 4 8 4 7 4 4 . 7 . . . .输出 17输入 3 4 . . . . . 2 . . . . . .输出 0输入 3 4 . . . . . 2 2 . . . . .输出 -1本题很坑爹的地方在于,输入的字符串还用空格分开,所以…

代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19. 删除链表的倒数第N个节点、160.链表相交、142.环形链表II

9-24.两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例 1:输入:head = [1,2,3,4] 输出:[2,1,4,3] 示例 2: 输入:head = [] 输出:[] 示例 3: 输入:he…

2025 省选模拟 6

2025 省选模拟 6 A.圣诞树 DP,计数题 考虑题目题目的两个限制相邻两层彩球颜色集合不同同层相邻两个彩球颜色不同发现求出每一行恰好 \(j\) 个颜色后第二个限制很简单就解决了。 设 \(f_{i,j}\) 表示长度为 \(i\) 时恰好有 \(j\) 个颜色的方案数(对于一行考虑) 设 \(g_{i,j}…

第一次

第一次 1. 神秘符文的重复序列 逻辑思维#include<bits/stdc++.h> using namespace std; int main(){int n,k;cin>>n>>k;//长度为n,重复k遍!string s;cin>>s;long long int ans=0;long long int cnt=0;while(k--) {//重复k遍for(int i=0;i<n;i++)…