精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

一道精品一区二区三区| 色婷婷**av毛片一区| www.国产在线播放| 亚洲 欧美 激情 小说 另类| 性8sex亚洲区入口| 色老头一区二区三区| 午夜性福利视频| 国产高清视频色在线www| 91首页免费视频| 国产日韩欧美在线看| 麻豆成人在线视频| 深爱激情久久| 日韩视频在线观看一区二区| 国产极品尤物在线| 在线观看免费黄色| 成人性生交大合| 国产精品精品视频| 动漫精品一区一码二码三码四码| 免费成人高清在线视频theav| 91精品欧美福利在线观看| 91免费版看片| 东热在线免费视频| 成人激情小说网站| 国产日韩欧美夫妻视频在线观看| 国产中文字幕免费| 天天综合亚洲| 亚洲精品永久免费| 亚洲av毛片在线观看| 中文字幕资源网在线观看免费| 中文字幕亚洲精品在线观看| 精品乱码一区二区三区| 97在线播放免费观看| 美女视频一区免费观看| 欧美激情免费观看| 国产在线观看免费视频软件| 亚洲精品推荐| 日韩精品在线一区二区| 精品999在线| 欧美gv在线| 亚洲精品国产成人久久av盗摄| 日韩av图片| 性猛交xxxx| 粉嫩嫩av羞羞动漫久久久| 国产免费一区二区三区在线观看| 久久久国产精品成人免费| 欧美日韩国产探花| 日韩一区二区福利| 亚洲精品91在线| 日韩成人一级| 日韩av在线免费| 精品人妻二区中文字幕| 国产精品一区免费在线| 欧美军同video69gay| 日本熟妇人妻中出| 1区2区3区在线| 一区二区免费视频| 青青草综合在线| 黄色网在线免费观看| 国产精品入口麻豆原神| 午夜欧美一区二区三区免费观看| 蜜桃视频在线观看网站| 久久久综合视频| 精品视频在线观看| 无码精品一区二区三区在线| a亚洲天堂av| 精品国产一区二区三| 少妇又色又爽又黄的视频| 国产91富婆露脸刺激对白| 91黄在线观看| 亚洲a视频在线观看| 国产69精品一区二区亚洲孕妇| 9a蜜桃久久久久久免费| 亚洲精品人妻无码| 成人禁用看黄a在线| 国模精品一区二区三区| 天天干,夜夜爽| 91亚洲精品乱码久久久久久蜜桃| 国产精品一区二区你懂得| 欧美一级片免费| 99视频一区二区| 韩国成人一区| 噜噜噜噜噜在线视频| 国产欧美日韩亚州综合| 婷婷五月色综合| 国产超级va在线视频| 一区二区三区日韩欧美| 男人添女荫道口女人有什么感觉| 免费在线观看av电影| 午夜一区二区三区在线观看| 国产特级黄色大片| 播放一区二区| 91精品国产91综合久久蜜臀| 中国特级黄色大片| 曰本一区二区三区视频| 中文字幕综合一区| 538精品在线观看| 日韩午夜黄色| 欧美自拍大量在线观看| 亚洲天堂免费av| 国产精品影视在线观看| 久久伊人资源站| 日本中文字幕在线播放| 亚洲香蕉伊在人在线观| 黄色日韩网站视频| 国产69精品久久久久9999| 自拍偷拍欧美亚洲| 日韩和欧美的一区| 91亚洲国产精品| 香蕉视频国产在线| 国产精品欧美极品| 日韩精品一区二区在线视频| 欧美成人精品一区二区男人小说| 欧美一区二区精品| 欧美性猛交xxxx乱| 国内在线观看一区二区三区| 国产精品黄色av| 亚洲乱码在线观看| 欧美激情一二三区| 国产精品久久..4399| 国产激情久久| 日韩h在线观看| 欧美精品久久久久久久久46p| 一区二区三区导航| 亚洲在线视频福利| аⅴ资源新版在线天堂| 亚洲一区在线播放| 亚洲最大天堂网| 妖精视频一区二区三区| 欧美精品aaa| 国产精品国产av| 久久精品日产第一区二区三区高清版 | 国产suv精品一区二区三区88区| av中文字幕播放| 国产欧美一区二区三区网站| 国产妇女馒头高清泬20p多| 欧美一级做a| 亚洲欧美另类人妖| 国产手机在线视频| 国产成人综合网站| 欧美日韩在线免费观看视频| 精品亚洲美女网站| 亚洲国产女人aaa毛片在线| 日韩一区二区不卡视频| 日本特黄久久久高潮| 免费成人深夜夜行视频| 超碰资源在线| 欧美zozozo| www.xxxx日本| 国内成人自拍视频| 亚洲国产成人不卡| 日韩在线短视频| 亚洲美女久久久| 欧美一二三区视频| www.日韩大片| 男人添女人下面高潮视频| 综合欧美亚洲| 欧美国产日韩一区二区在线观看 | 欧美成人直播| 国产精品久久久久久中文字 | 自拍偷拍亚洲区| 欧美三级网站在线观看| 国产三级一区二区三区| 黄色一级免费大片| av在线不卡顿| 国产精品视频自在线| 色网站免费在线观看| 欧美久久久久久久久中文字幕| 国精产品视频一二二区| 精品一区二区三区久久| 国产高清免费在线| 精品国产亚洲一区二区三区大结局| 久久视频这里只有精品| www.看毛片| 亚洲国产日韩一级| 亚洲精品乱码久久久久久不卡 | 最近免费中文字幕中文高清百度| 奇米影视777在线欧美电影观看| 韩国三级日本三级少妇99| 你懂的在线观看视频网站| 色8久久精品久久久久久蜜| 最近中文字幕在线mv视频在线| 日韩av一区二区三区| 国产又大又长又粗又黄| 久久久久久亚洲精品美女| 97国产一区二区精品久久呦 | 欧美日韩精品免费观看视一区二区| 吞精囗交69激情欧美| 日韩在线视频免费观看高清中文| 国产毛片毛片毛片毛片| 亚洲高清一区二区三区| 久久久久久国产精品无码| 麻豆成人免费电影| 久久精品无码中文字幕| 国产亚洲欧美日韩在线观看一区二区 | 成人一级片免费看| 国产一区二区三区免费| 精品无码一区二区三区在线| 国产精品自拍区| 91精品啪aⅴ在线观看国产| av中文字幕在线看| 在线视频欧美性高潮| 成人av手机在线| 色综合咪咪久久| 麻豆明星ai换脸视频| 91农村精品一区二区在线| 无尽裸体动漫2d在线观看| 在线观看不卡| 制服诱惑一区| 丝袜美腿一区二区三区动态图| 成人久久一区二区三区| 色戒汤唯在线观看| 俺去亚洲欧洲欧美日韩| 十九岁完整版在线观看好看云免费| 在线播放国产精品二区一二区四区 | 不卡的国产精品| 456亚洲影院| 影音先锋在线播放| 影音先锋日韩有码| 天天爱天天干天天操| 欧美日韩不卡一区二区| 99热只有这里有精品| 一区二区视频在线| 大吊一区二区三区| 久久综合色婷婷| www.四虎精品| 激情另类小说区图片区视频区| 久久精品.com| 合欧美一区二区三区| a级黄色片网站| 日韩成人免费| 青娱乐一区二区| 久久资源综合| 99国产在线| 91成人精品观看| 国产精品日韩在线一区| 一级毛片久久久| 欧美激情视频三区| 成人免费看片| 日韩在线视频导航| 91大神在线网站| 亚洲欧美成人一区二区在线电影| 神马一区二区三区| 精品久久一二三区| 精品人妻aV中文字幕乱码色欲| 欧美日韩激情在线| 这里只有精品国产| 91成人在线精品| 久久精品视频1| 亚洲一二三四在线| 国产在线一二区| 亚洲一区在线观看免费观看电影高清| 538精品在线视频| 日韩一区欧美小说| 久久高清内射无套| 日韩理论片在线| 久久久久麻豆v国产| 国产精品久久久久久久久快鸭| 国产又粗又猛又爽又黄的视频四季| 久久精品夜色噜噜亚洲aⅴ| 91精品人妻一区二区| 久久午夜老司机| 久久久久亚洲av成人无码电影| 国产亚洲一区二区三区在线观看| 四虎国产精品成人免费入口| 国产偷v国产偷v亚洲高清| 九九九视频在线观看| 国产精品伦理在线| 天天色影综合网| 亚洲美腿欧美偷拍| 国产在线视频卡一卡二| 婷婷激情综合网| 中文字幕精品视频在线观看| 欧美在线免费播放| 中文字幕日韩国产| 911精品产国品一二三产区| 99在线观看精品视频| 精品久久久久久久人人人人传媒| 狠狠躁夜夜躁av无码中文幕| 日韩成人激情视频| 成人免费视频| 久久电影一区二区| 在线观看a级片| 668精品在线视频| 3d性欧美动漫精品xxxx软件| 国产日韩在线亚洲字幕中文| 免费欧美网站| 精品在线视频一区二区| 国产麻豆精品久久| 中文字幕中文字幕在线中心一区| 欧美日本不卡高清| 国产无套内射久久久国产| 男人操女人的视频在线观看欧美| 红桃视频 国产| 白白色亚洲国产精品| av永久免费观看| 亚洲欧美日韩在线不卡| 免费在线不卡视频| 欧美视频一区二区三区四区| www.综合色| 亚洲欧洲一区二区三区在线观看| 黄色免费网站在线观看| 欧美一级淫片videoshd| 黄在线免费看| 国产激情精品久久久第一区二区| 亚洲成人av免费观看| 成人黄页网站视频| 国产在线观看精品一区二区三区| 日本免费一区二区视频| 免费看成人午夜电影| 99视频精品全国免费| 欧美综合在线播放| 美女一区二区视频| 特级西西人体4444xxxx| 国产精品美女久久久久aⅴ国产馆| 免费在线观看黄色av| 欧美这里有精品| 欧美 日韩 国产 精品| 影音先锋日韩有码| 白浆在线视频| 91老司机精品视频| 亚洲婷婷影院| 久久这里只有精品8| 人妖欧美一区二区| 性囗交免费视频观看| 亚洲欧美日韩国产成人精品影院 | 国产亚洲欧美日韩美女| 午夜在线激情影院| 国产精品一久久香蕉国产线看观看| 林ゆな中文字幕一区二区| 亚洲精品偷拍视频| 免费一级片91| 无遮挡aaaaa大片免费看| 一区二区三区国产| 国产一区二区三区视频免费观看| 亚洲欧美日韩高清| 黄色漫画在线免费看| 99精品国产高清一区二区| 天天天综合网| 日本xxxx黄色| 久久精品网站免费观看| 国产成人无码精品久久久久| 欧美成人官网二区| 福利在线视频网站| 成人福利在线观看| 凹凸成人精品亚洲精品密奴| 欧美视频免费播放| xnxx国产精品| 欧美三级一区二区三区| 精品国产91洋老外米糕| 日本伦理一区二区| 亚洲影院污污.| 夜间精品视频| 欧美专区第二页| 亚洲激情中文1区| 国产精品一二三四五区| 色偷偷88888欧美精品久久久| 成人国产精品| 视频一区二区综合| 免费在线观看成人| 黄色激情小视频| 欧美日韩国产一级| 免费**毛片在线| 成人av色在线观看| 亚洲美女视频| 中文字幕av一区二区三区人妻少妇| 亚洲视频一区二区在线观看| 国产精品午夜福利| 欧美片一区二区三区| 伊人久久噜噜噜躁狠狠躁| 国产精品一色哟哟| 91在线小视频| 国产suv精品一区二区33| 在线播放国产一区二区三区| 日本久久二区| 国产日韩欧美大片| 国产99精品在线观看| 黄色片视频网站| 亚洲人成在线观看网站高清| 国产精品麻豆成人av电影艾秋| 四虎一区二区| 国产一区二区美女诱惑| 久久免费视频6| 亚洲精品xxx| 国产经典一区| 异国色恋浪漫潭| 风间由美一区二区三区在线观看| 久久精品国产成人av| 夜夜嗨av一区二区三区四区| 成人综合日日夜夜| 成人午夜精品久久久久久久蜜臀| 久久这里只有精品视频网| 正在播放亚洲精品| 欧美精品中文字幕一区| 丝袜美腿一区二区三区动态图| 亚洲成人av免费看| 一区二区三区四区在线播放| 色鬼7777久久| 成人国产在线激情| 99精品国产在热久久| 992在线观看|