[Babel] Intro Babel - 05. API

news/2025/1/16 21:00:41/文章来源:https://www.cnblogs.com/Answer1215/p/18675751

APIs

关于 babel 里面的 APIs 主要位于 @babel/core 这个依赖里面,你可以在官网左下角的 Tooling Packages 分类下找到这个依赖包。

这里顺便介绍一下每一种依赖包的作用:

  • @babel/parser: 是 Babel 的解析器,用于将源代码转换为 AST
  • @babel/core: Babel 的核心包,它提供了 Babel 的核心编译功能。这个包是使用 Babel 必须安装的。
  • @babel/generator: 是 Babel 的代码生成器,它接收一个 AST 并将其转换为代码和源码映射(sourcemap)。
  • @babel/code-frame: 提供了一种用于生成 Babel 错误消息的方法,可以在代码帧中高亮显示错误。
  • @babel/runtime: 提供了 Babel 运行时所需要的辅助函数和 polyfills,以避免在每个文件中都重复这些代码。
  • @babel/template: 提供了一种编写带有占位符的 Babel AST 模板的方法。
  • @babel/traverse: 是 BabelAST 遍历器,它包含了一些用于处理 AST 的工具。
  • @babel/types: 提供了一种用于 AST 节点的 Lodash-esque 实用程序库。

在第一节课的时候,我们安装了三个依赖:core、cli、preset,但是我们使用 babel 进行编译的时候发现最终是生成了编译后的代码的,而从 AST 生成编译后代码是 generator 的工作,实际上当你安装 core 的时候,就会间接的安装 generator、traverse 等需要用到的依赖包。

通过对官方 API 的观察,我们发现 babel/core 的 API 主要分为三大类:

  • transformXXX
  • parseXXX
  • loadXXX

transformXXX

这一组方法一看就是做和编译相关的操作,之所以有这么多,其实就是同步或者异步、编译代码或者文件的区别,每个方法的具体含义如下:

  • transform(code: string, options: Object): 这是一个异步函数,用于将源代码字符串转换为 Babel 的结果对象。结果对象包含了转换后的代码,源码映射,以及 AST
  • transformSync(code: string, options: Object): 这个函数和 transform 函数功能相同,但它是同步执行的。
  • transformAsync(code: string, options: Object): 这个函数和 transform 函数功能相同,它返回一个 Promise,这个 Promise 会在转换完成后解析为结果对象。
  • transformFile(filename: string, options: Object, callback: Function): 这个函数会读取并转换指定的文件。转换完成后,会调用提供的回调函数,并将结果对象传递给回调函数。
  • transformFileSync(filename: string, options: Object): 这个函数和 transformFile 函数功能相同,但它是同步执行的。
  • transformFileAsync(filename: string, options: Object): 这个函数和 transformFile 函数功能相同,它返回一个 Promise,这个 Promise 会在转换完成后解析为结果对象。
  • transformFromAst(ast: Object, code: string, options: Object): 这个函数接受一个 AST 对象,然后将这个 AST 转换为 Babel 的结果对象。这个函数可以用于在已经有 AST 的情况下避免重新解析代码。
  • transformFromAstSync(ast: Object, code: string, options: Object): 这个函数和 transformFromAst 函数功能相同,但它是同步执行的。
  • transformFromAstAsync(ast: Object, code: string, options: Object): 这个函数和 transformFromAst 函数功能相同,它返回一个 Promise,这个 Promise 会在转换完成后解析为结果对象。

上面这些方法中,只要搞懂一个,其他的也就搞懂了。

parseXXX

该系列方法主要负责将源码转为抽象语法树(AST),之后就不管了。

  • parse(code: string, options: Object): 这是一个异步函数,用于解析源代码字符串并返回一个 AST。你可以通过选项对象来配置解析过程,例如是否包含注释,是否包含 location 信息等。

  • parseSync(code: string, options: Object): 这个函数和 parse 函数功能相同,但它是同步执行的。

  • parseAsync(code: string, options: Object): 这个函数和 parse 函数功能相同,它返回一个 Promise,这个 Promise 会在解析完成后解析为 AST

loadXXX

这一系列方法主要是做配置文件的加载工作的

  • loadOptions(options: Object): 这个函数接受一个选项对象,然后返回一个完整的、已解析的 Babel 配置对象。这个配置对象包括了所有的预设,插件,和其他配置选项。如果提供的选项对象中没有指定配置,那么这个函数会尝试从 .babelrc 文件或 babel.config.js 文件中加载配置。

    例如:

    const babel = require('@babel/core');const options = {filename: './src/myFile.js',
    };const config = babel.loadOptions(options);console.log(config);
    

    在这个例子中,我们首先导入了 @babel/core,然后定义了一个选项对象。这个对象中,filename 属性指定了我们正在处理的文件的路径。然后我们使用 @babel/coreloadOptions 方法来加载 Babel 的配置。

    loadOptions 方法返回一个配置对象,这个对象包括了所有的预设,插件,和其他配置选项。在这个例子中,我们将这个配置对象打印到控制台。

  • loadPartialConfig(options: Object): 这个函数和 loadOptions 函数类似,但是返回的配置对象可能是部分的,也就是说,它可能没有包括所有的预设和插件。这个函数主要用于在构建工具中,当你需要对 Babel 配置进行更精细的控制时。


// file name: transform.jsconst babel = require("@babel/core");const code ='const greet = (name) => `Hello, ${name}!`;console.log(greet("World"));';babel.transform(code,{presets: ["@babel/preset-env"],},function (err, result) {if (err) throw err;console.log(result.code);}
);```````js// filename: transformFile.jsconst fs = require("fs");
const path = require("path");
const babel = require("@babel/core");// 设置路径
const srcDir = path.resolve(__dirname, "src");
const outDir = path.resolve(__dirname, "dist");if (!fs.existsSync(outDir)) {fs.mkdirSync(outDir);
}fs.readdir(srcDir, (err, files) => {if (err) throw err;files.forEach((file) => {if (path.extname(file) === ".js") {const filePath = path.join(srcDir, file);const outputPath = path.join(outDir, file);const result = babel.transformFileSync(filePath, {presets: ["@babel/preset-env"],});fs.writeFileSync(outputPath, result.code);}});
});```````js//parse.jsconst babel = require("@babel/core");const code ='const greet = (name) => `Hello, ${name}!`;console.log(greet("World"));';babel.parse(code,(err, ast)=>{if (err) throw err;console.log(JSON.stringify(ast, null, 2));})```````js// filename: load options.jsconst babel = require("@babel/core");const options = {filename: "./src/myFile.js",
};const config = babel.loadOptions(options);console.log(config);```

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