精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試官: 你了解過Babel嗎?寫過Babel插件嗎? 答: 沒有。卒

開發 前端
了解過抽象語法樹,又稱AST,有學習過,也寫過一個基于AST的乞丐版模板引擎,先是詞法解析token,然后生產抽象語法樹,然后更改抽象語法樹,當然這是插件做的事情,最后根據新的AST生成代碼。

面試大廠,其中有那么一個問題:

1.你了解過Babel嗎?

了解過抽象語法樹,又稱AST,有學習過,也寫過一個基于AST的乞丐版模板引擎,先是詞法解析token,然后生產抽象語法樹,然后更改抽象語法樹,當然這是插件做的事情,最后根據新的AST生成代碼。

2.寫過Babel插件嗎

沒有,只是看過相關文檔

3.如果讓你寫一個插件,你能寫的出來嗎?

啊,這,我試試!

遂卒....

開玩笑的,既然提到了,又沒回答上來什么,哎喲我這暴脾氣,一想到今晚就睡不著,連夜把它擼了。

那么我們來從零寫個插件吧。

寫一個預計算簡單表達式的插件

預覽

Before:

const result = 1 + 2 + 3 + 4 + 5;

After:

const result = 15;

以上的例子可能大家不會經常遇到,因為傻x才會這么寫,但是有可能你會這么寫

setTimeout(function(){
// do something
}, 1000 * 2) // 插件要做的事,就是把 1000 * 2 替換成 2000

開工

在寫代碼之前,你需要明白Babel它的原理,簡單點說:Babel解析成AST,然后插件更改AST,最后由Babel輸出代碼。

那么Babel的插件模塊需要你暴露一個function,function內返回visitor。

module.export = function(babel){
return {
visitor:{
}
}
}

visitor是對各類型的AST節點做處理的地方,那么我們怎么知道Babel生成了的AST有哪些節點呢?

很簡單,你可以把Babel轉換的結果打印出來,或者這里有傳送門: AST explorer:https://astexplorer.net/

這里我們看到 const result = 1 + 2中的1 + 1是一個BinaryExpression節點,那么在visitor中,我們就處理這個節點

var babel = require('babel-core');
var t = require('babel-types');
const visitor = {
BinaryExpression(path) {
const node = path.node;
let result;
// 判斷表達式兩邊,是否都是數字
if (t.isNumericLiteral(node.left) && t.isNumericLiteral(node.right)) {
// 根據不同的操作符作運算
switch (node.operator) {
case "+":
result = node.left.value + node.right.value;
break
case "-":
result = node.left.value - node.right.value;
break;
case "*":
result = node.left.value * node.right.value;
break;
case "/":
result = node.left.value / node.right.value;
break;
case "**":
let i = node.right.value;
while (--i) {
result = result || node.left.value;
result = result * node.left.value;
}
break;
default:
}
}
// 如果上面的運算有結果的話
if (result !== undefined) {
// 把表達式節點替換成number字面量
path.replaceWith(t.numericLiteral(result));
}
}
};
module.exports = function (babel) {
return {
visitor
};
}

插件寫好了,我們運行下插件試試

const babel = require("babel-core");
const result = babel.transform("const result = 1 + 2;",{
plugins:[
require("./index")
]
});
console.log(result.code); // const result = 3;

與預期一致,那么轉換 const result = 1 + 2 + 3 + 4 + 5;呢?

結果是: const result = 3 + 3 + 4 + 5;

這就奇怪了,為什么只計算了1 + 2之后,就沒有繼續往下運算了?

我們看一下這個表達式的AST樹

你會發現Babel解析成表達式里面再嵌套表達式。

表達式( 表達式( 表達式( 表達式(1 + 2) + 3) + 4) + 5)

而我們的判斷條件并不符合所有的,只符合1 + 2

// 判斷表達式兩邊,是否都是數字
if (t.isNumericLiteral(node.left) && t.isNumericLiteral(node.right)) {}

那么我們得改一改

第一次計算1 + 2之后,我們會得到這樣的表達式

表達式( 表達式( 表達式(3 + 3) + 4) + 5)

其中 3 + 3又符合了我們的條件, 我們通過向上遞歸的方式遍歷父級節點 又轉換成這樣:

表達式( 表達式(6 + 4) + 5)
表達式(10 + 5)
15
// 如果上面的運算有結果的話
if (result !== undefined) {
// 把表達式節點替換成number字面量
path.replaceWith(t.numericLiteral(result));
let parentPath = path.parentPath;
// 向上遍歷父級節點
parentPath && visitor.BinaryExpression.call(this, parentPath);
}

到這里,我們就得出了結果 const result = 15;

那么其他運算呢:

const result = 100 + 10 - 50 >>> const result = 60;
const result = (100 / 2) + 50 >>> const result = 100;
const result = (((100 / 2) + 50 * 2) / 50) ** 2 >>> const result = 9;

完結

到這里,已經向你大概的講解了,如何編寫一個Babel插件,再也不怕面試官問我答不出什么了哈...

你以為這就完了嗎?

并沒有

如果轉換這樣呢: const result = 0.1 + 0.2;

預期肯定是0.3, 但是實際上,Javascript有浮點計算誤差,得出的結果是0.30000000000000004

那是不是這個插件就沒卵用?

這就需要你去矯正浮點運算誤差了,可以使用Big.js; 比如: result = node.left.value + node.right.value; 改成 result = +new Big(node.left.value).plus(node.right.value);你以為完了嗎? 這個插件還可以做很多

比如: Math.PI * 2 >>> 6.283185307179586
比如: Math.pow(2, 2) >>> 4
...
...

優化

有旁友指出:

parentPath那一塊可以換個實現方法。第一個binaryExpression真正被計算之后是會被替換成numericLiteral的。由于每個node都會被visit兩次,所以在exit訪問時,對于父節點而言兩個子節點又同時是numericLiteral了,再次執行即可。

也就是說,只要在enter和exit節點的時候,都執行一下上面替換節點的代碼就行,無須手動遍歷父節點去計算并替換~

BinaryExpression: {
exit: path => {
const node = path.node;
const result = node.left.value + node.right.value
path.replaceWith(t.numericLiteral(result));
}
}

真是個不錯的方法呢!

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2022-08-02 06:31:32

Java并發工具類

2022-07-26 08:40:42

Java并發工具類

2022-06-30 08:14:05

Java阻塞隊列

2022-07-11 10:47:46

容器JAVA

2024-09-03 07:58:46

2022-06-10 13:56:42

Java

2022-06-30 14:31:57

Java阻塞隊列

2020-09-26 22:04:32

數據安全傳輸HTTPSHTTP 協議

2024-09-09 08:30:56

代碼

2022-06-08 13:54:23

指令重排Java

2022-06-15 15:14:17

Java公平鎖非公平鎖

2022-06-09 11:20:44

volatile關鍵字

2021-04-12 21:34:29

Redis故障數據

2022-06-24 06:43:57

線程池線程復用

2023-11-10 08:44:13

分布式鎖分布式系統

2023-09-26 00:37:38

Spring微服務框架

2020-10-08 14:15:15

Zookeeper

2021-09-01 07:21:41

面試官開發讀寫鎖

2020-06-17 21:22:56

Serverless面試官架構

2019-12-25 11:22:19

負載均衡集群算法
點贊
收藏

51CTO技術棧公眾號

99久久国产综合色|国产精品| 国产成人精品免费视| 亚洲图片有声小说| 欧美二区三区在线| 国产乱人乱偷精品视频a人人澡| 欧美激情视频一区二区三区在线播放 | 国产一区在线观看免费| 99久久免费精品国产72精品九九| 色噜噜久久综合| 免费观看国产视频在线| 国产中文在线视频| 国产激情视频一区二区三区欧美| 日本伊人精品一区二区三区介绍| 动漫性做爰视频| 美日韩中文字幕| 日韩美女天天操| 亚洲欧美日韩一级| 天堂8中文在线最新版在线| 中文字幕佐山爱一区二区免费| 精品国产中文字幕| 国产视频一二三四区| 亚洲免费影院| 欧美激情乱人伦一区| 狂野欧美性猛交| 宅男在线一区| 亚洲第一精品自拍| 日本少妇一区二区三区| 成人亚洲视频| 日韩欧美主播在线| 高清无码一区二区在线观看吞精| 天堂а√在线资源在线| 久久婷婷国产综合精品青草| 国产精品免费区二区三区观看| 中文字幕欧美人妻精品一区蜜臀| 亚洲自啪免费| 97国产真实伦对白精彩视频8| 国产suv一区二区三区| 欧美电影免费播放| 国产一区二区三区在线| 亚洲成人日韩在线| 欧美天堂社区| 日韩欧美成人一区| 日韩av影视大全| 91精品在线免费视频| 欧美日韩一区二区三区在线| 亚洲精品中文字幕无码蜜桃| 台湾佬中文娱乐网欧美电影| 午夜不卡av免费| 亚洲 欧美 综合 另类 中字| 九色91在线| 亚洲一区二区三区四区在线| 日韩成人手机在线| 成人在线免费看片| 中文在线免费一区三区高中清不卡| 欧美日韩国产不卡在线看| 色综合久久网女同蕾丝边| 91尤物视频在线观看| 国产日韩欧美二区| 国产77777| 国产.欧美.日韩| av成人观看| 日韩一级片免费看| 91视频国产资源| 欧美视频观看一区| 在线观看a视频| 亚洲欧美激情插 | 欧洲在线视频| 亚洲一区二区三区四区不卡| 亚洲 欧美 日韩 国产综合 在线 | 狠狠躁夜夜躁人人爽超碰91| 久久久999视频| 欧美一区久久久| 欧美日韩免费观看一区三区| 国产精品探花在线播放| 日韩一区二区三区在线看| 欧美成人乱码一区二区三区| a级一a一级在线观看| 国产精品亚洲二区| www日韩欧美| 国产稀缺真实呦乱在线| 亚洲一区二区网站| 国产精品永久免费观看| 亚洲爱情岛论坛永久| 91蜜桃传媒精品久久久一区二区| 欧美成人蜜桃| 黄色av免费在线| 天天av天天翘天天综合网色鬼国产 | 老司机在线永久免费观看| 有坂深雪av一区二区精品| 久久婷婷五月综合色国产香蕉| 成人久久网站| 亚洲成色777777女色窝| 亚洲午夜精品久久久久久高潮 | 久久婷婷五月综合色国产香蕉| 国产精品久久久久久久久久齐齐| 欧美一区二区三区播放老司机| 女同性恋一区二区三区| 日本久久精品| 午夜精品福利在线观看| 亚洲熟女乱色一区二区三区久久久| 国产在线麻豆精品观看| 欧美激情第六页| 亚洲国产精品精华素| 欧美性猛交xxxx乱大交| 欧美日韩久久婷婷| 国产aⅴ精品一区二区三区久久| 久久影视电视剧免费网站| 久久国产精品免费看| 国产精品白丝jk白祙喷水网站| 欧美日韩亚洲在线| 日本天码aⅴ片在线电影网站| 在线观看av一区| 波多野结衣加勒比| 我不卡影院28| 国产精品久久97| 天堂av在线免费观看| 一区二区三区中文字幕电影| 国产原创精品在线| 要久久爱电视剧全集完整观看| 色综合导航网站| 久久99影院| 国产成人久久久| 精品国产大片大片大片| 99精品福利视频| 亚洲精品日韩激情在线电影| 成人全视频高清免费观看| 午夜国产精品一区| 黄色三级视频在线播放| 日韩专区精品| 国产成人精彩在线视频九色| 色窝窝无码一区二区三区| 亚洲天天做日日做天天谢日日欢| 午夜视频在线瓜伦| 日韩欧美天堂| 97激碰免费视频| 成人乱码一区二区三区| 一区二区三区蜜桃| 91欧美一区二区三区| 五月婷婷亚洲| 91老司机在线| 九色porny在线| 欧美日韩国产综合一区二区三区| 五月天精品在线| 久久久久久久久久97| 欧美精品激情| 99精品国产高清在线观看| 黄色在线免费看| 91精品综合久久久久久| 1024手机在线视频| 国产aⅴ综合色| 日韩成人手机在线| 亚洲一级大片| 久久人人爽人人爽人人片av高清| 亚洲国产精品视频在线| 亚洲国产视频在线| 精品人妻一区二区三区日产| 亚洲日韩视频| 久久精品99久久| 免费观看一级欧美片| 日韩精品在线观看网站| 日韩一级片中文字幕| 国产日韩欧美制服另类| 精品999在线| 亚洲五月综合| 国产高清在线一区二区| 黄视频免费在线看| 亚洲天堂第二页| 中文在线观看免费高清| 亚洲女厕所小便bbb| 蜜臀视频在线观看| 日韩图片一区| 欧美性bbwbbwbbwhd| 人人精品久久| 欧美激情日韩图片| 少妇性bbb搡bbb爽爽爽欧美| 欧美三级三级三级爽爽爽| 99自拍视频在线| 懂色一区二区三区免费观看| 激情六月丁香婷婷| 天天综合精品| 激情伦成人综合小说| 日韩欧美一区二区三区免费观看 | 国产精品一区在线看| 欧美久久一二三四区| 国产真人真事毛片| 国产色爱av资源综合区| 日本高清免费观看| 99伊人成综合| 一区二区三区四区五区视频| 91蝌蚪精品视频| 日本精品久久久久久久| 中文字幕在线观看网站| 国产丝袜一区二区三区免费视频| 国产又粗又猛又爽又黄的| 亚洲mv在线观看| 女同久久另类69精品国产 | 国产熟女一区二区| 国产成人免费视频网站| 能看的毛片网站| 精品动漫一区| 中文字幕不卡每日更新1区2区| 高清精品xnxxcom| 成人国产精品色哟哟| 无码小电影在线观看网站免费| 久久亚洲国产精品| 国产有码在线| 日韩成人在线视频| 国产伦精品一区二区三区视频痴汉| 欧美色视频日本版| 欧美久久久久久久久久久久| 中文字幕不卡一区| 人妻丰满熟妇av无码久久洗澡| 国产美女娇喘av呻吟久久| 免费在线观看毛片网站| 日韩亚洲国产精品| 三级在线免费观看| 久久裸体网站| 日本一区二区三区免费观看| 97久久综合精品久久久综合| 成人免费自拍视频| 91在线成人| 欧美一级大胆视频| 国产乱码精品一区二三赶尸艳谈| 久久国产精品久久久久久久久久 | 亚洲国产日韩一级| 深夜视频在线观看| 国内一区二区视频| 99视频在线视频| 久久在线91| 国产精品宾馆在线精品酒店| 国产综合精品| 成年丰满熟妇午夜免费视频| 久久久久久久久久久久久久久久久久 | 亚洲综合网av| 欧美亚洲高清一区| www.久久精品视频| 黑人狂躁日本妞一区二区三区 | 在线一区欧美| 欧美在线一区视频| 亚洲区欧美区| 少妇人妻无码专区视频| 精品99视频| 男人添女荫道口女人有什么感觉| 欧美精品一级| 第九区2中文字幕| 自由日本语亚洲人高潮| 路边理发店露脸熟妇泻火| 亚洲欧洲中文字幕| 2021国产视频| 欧美韩国一区| 免费人成在线观看视频播放| 你懂的国产精品永久在线| 日韩不卡视频一区二区| 欧美深夜福利| 3d动漫一区二区三区| 国产欧美日本| 凹凸国产熟女精品视频| 日韩精品视频网站| 三上悠亚av一区二区三区| 精品一区免费av| 韩国三级丰满少妇高潮| 成人做爰69片免费看网站| 一级黄色片毛片| 久久一区二区视频| 国产精品理论在线| 亚洲人xxxx| 69精品久久久| 色婷婷综合久久久久中文一区二区 | 国产视频亚洲| 日韩一级免费在线观看| 美美哒免费高清在线观看视频一区二区| 欧美成人福利在线观看| 国产成人精品三级麻豆| 成人在线视频免费播放| 国产日韩欧美制服另类| 日本黄色片免费观看| 亚洲国产视频直播| 国语对白做受69按摩| 欧美一区二区三区四区视频| 国产 日韩 欧美 精品| 亚洲天堂成人在线视频| 18加网站在线| 欧美一级片在线播放| 成人黄色免费观看| 国产精品国模大尺度私拍| 伊人春色精品| 国产成人免费高清视频| 久久先锋资源| 欧美xxxxxbbbbb| 337p粉嫩大胆色噜噜噜噜亚洲| ass极品国模人体欣赏| 亚洲一级不卡视频| 最近中文字幕在线免费观看| 精品精品国产高清a毛片牛牛| 精品999视频| 欧美激情久久久久| 精品女同一区二区三区在线观看| 国产成人免费观看| 久久亚洲成人| 青青草原av在线播放| 国产一区二区剧情av在线| 蜜桃传媒一区二区亚洲av| 一区二区三区在线影院| 精品成人无码久久久久久| 日韩午夜在线观看视频| 成人福利在线| 91av中文字幕| 视频一区在线| 一区二区三区四区五区视频| 亚洲在线观看| 免费黄视频在线观看| 中文一区一区三区高中清不卡| www.国产高清| 亚洲精品一区二区三区福利| 日韩精品毛片| 国产成人久久精品| 性人久久久久| 九一国产精品视频| 国产精品一区2区| 战狼4完整免费观看在线播放版| 狠狠久久亚洲欧美专区| 色一情一乱一乱一区91av| 欧美成aaa人片免费看| 日本中文字幕视频一区| 图片区小说区区亚洲五月| 国产女优一区| 特级西西人体wwwww| 亚洲一区二区三区国产| www三级免费| 九九视频这里只有精品| 国产美女精品视频免费播放软件| 亚洲激情电影在线| 亚洲影音一区| 懂色av粉嫩av蜜乳av| 婷婷开心激情综合| 日本精品久久久久久| 欧美极品xxxx| 成人高潮视频| 很污的网站在线观看| 成人动漫av在线| 国产乱码久久久久久| 亚洲精品成人av| 欧亚在线中文字幕免费| 精品一区二区三区视频日产| 夜夜精品视频| 国产精品久久久免费观看| 精品福利视频导航| 嫩草精品影院| 中文字幕av不卡| 一二三av在线| 悠悠色在线精品| 黄色片一区二区三区| 久久久免费高清电视剧观看| 黑人久久a级毛片免费观看| 欧美一区二区激情| 99re这里只有精品视频首页| 国产一级片毛片| 亚洲精品小视频| 日韩漫画puputoon| 中文网丁香综合网| 国产成人三级在线观看| 中文字幕一区二区三区手机版| 亚洲国产精品美女| 春暖花开亚洲一区二区三区| 亚洲成人蜜桃| 国产一区二区精品久久99| 久久久久久久久久99| 精品亚洲国产视频| 久久精品xxxxx| 2021国产视频| 99re热视频这里只精品| 国产男人搡女人免费视频| 日韩中文在线中文网在线观看| 日韩视频一二区| 欧美国产激情视频| 国产精品麻豆欧美日韩ww| 精品毛片一区二区三区| 91高清免费视频| 欧美一区二区三| 国产乱国产乱老熟300部视频| 欧美日韩免费网站| 午夜不卡视频| 国产欧美日韩一区| 日韩影院精彩在线| 欧美黑人精品一区二区不卡| 日韩精品视频在线观看免费| 男人亚洲天堂| 国产不卡一区二区视频| 国产精品天天看| 国产综合在线播放| 国产精品视频地址| 亚洲精品极品| 国产小视频你懂的| 亚洲电影免费观看高清完整版在线 | 亚洲视频一区二区在线| 婷婷久久久久久| 成人黄色免费看| 久久av最新网址| 久久久久无码国产精品不卡| 一区二区中文字幕|