-
解析: 将代码(其实就是字符串)转换成 AST( 抽象语法树)
-
转换: 访问 AST 的节点进行变换操作生成新的 AST
-
生成: 以新的 AST 为基础生成代码
举个例子:
// JS
const add = (a,b) => a+b;
// 上面代码生成的AST
{
“type”: “Program”,
“body”: [
{
“type”: “VariableDeclaration”, // 变量声明
“declarations”: [ // 具体声明
{
“type”: “VariableDeclarator”, // 变量声明
“id”: {
“type”: “Identifier”, // 标识符(最基础的)
“name”: “add” // 函数名
},
“init”: {
“type”: “ArrowFunctionExpression”, // 箭头函数
“id”: null,
“expression”: true,
“generator”: false,
“params”: [ // 参数
{
“type”: “Identifier”,
“name”: “a”
},
{
“type”: “Identifier”,
“name”: “b”
}
],
“body”: { // 函数体
“type”: “BinaryExpression”, // 二项式
“left”: { // 二项式左边
“type”: “Identifier”,
“name”: “a”
},
“operator”: “+”, // 二项式运算符
“right”: { // 二项式右边
“type”: “Identifier”,
“name”: “b”
}
}
}
}
],
“kind”: “const”
}
],
“sourceType”: “module”
}
Babel工作流程
- Parse(解析)
Parse
阶段分为两个阶段:词法分析和语法分析
- 词法分析:可以看成是对代码进行“分词”,它接收一段源代码,然后执行一段 tokenize 函数,把代码分割成被称为Tokens(令牌流)。
[
{ “type”: “Keyword”, “value”: “const” },
{ “type”: “Identifier”, “value”: “add” },
{ “type”: “Punctuator”, “value”: “=” },
{ “type”: “Punctuator”, “value”: “(” },
{ “type”: “Identifier”, “value”: “a” },
{ “type”: “Punctuator”, “value”: “,” },
{ “type”: “Identifier”, “value”: “b” },
{ “type”: “Punctuator”, “value”: “)” },
{ “type”: “Punctuator”, “value”: “=>” },
{ “type”: “Identifier”, “value”: “a” },
{ “type”: “Punctuator”, “value”: “+” },
{ “type”: “Identifier”, “value”: “b” }
]
模拟实现
function tokenize(code) {
if (!code || code.length === 0) {
return [];
}
var current = 0; // 记录位置
var tokens = []; // 定义一个空的 token 数组
var LETTERS = /[a-zA-Z$_]/i;
var KEYWORDS = /const/; // 模拟一下判断是不是关键字
var WHITESPACE = /\s/;
var PARENS = /(|)/;
var NUMBERS = /[0-9]/;
var OPERATORS = /[+*/-]/;
var PUNCTUATORS = /[~!@#$%^&*()/|,.<>?"';:_±=[]{}]/;
// 从第一个字符开始遍历
while (current < code.length) {
var char = code[current];
// 判断空格
if (WHITESPACE.test(char)) {
current++;
continue;
}
// 判断连续字符
if (LETTERS.test(char)) {
var value = ‘’;
var type = ‘Identifier’;
while (char && LETTERS.test(char)) {
value += char;
char = code[++current];
}
// 判断是否是关键字
if (KEYWORDS.test(value)) {
type = ‘Keyword’
}
tokens.push({
type: type,
value: value
});
continue;
}
// 判断小括号
if (PARENS.test(char)) {
tokens.push({
type: ‘Paren’,
value: char
});
current++;
continue;
}
// 判断连续数字
if (NUMBERS.test(char)) {
var value = ‘’;
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
计算机网络
-
HTTP 缓存
-
你知道 302 状态码是什么嘛?你平时浏览网页的过程中遇到过哪些 302 的场景?
-
HTTP 常用的请求方式,区别和用途?
-
HTTPS 是什么?具体流程
-
三次握手和四次挥手
-
你对 TCP 滑动窗口有了解嘛?
-
WebSocket与Ajax的区别
-
了解 WebSocket 嘛?
-
HTTP 如何实现长连接?在什么时候会超时?
-
TCP 如何保证有效传输及拥塞控制原理。
-
TCP 协议怎么保证可靠的,UDP 为什么不可靠?
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
算法
-
链表
-
字符串
-
数组问题
-
二叉树
-
排序算法
-
二分查找
-
动态规划
-
BFS
-
栈
-
DFS
-
回溯算法
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
算法
-
链表
-
字符串
-
数组问题
-
二叉树
-
排序算法
-
二分查找
-
动态规划
-
BFS
-
栈
-
DFS
-
回溯算法