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

你怎么可以不了解 AST 呢?

開發 前端
我們編寫業務代碼的時候,可能很少人會使用到AST,以至于大多數同學都不大了解AST。本文將通過以下幾個方面對AST進行學習。

[[410644]]

前言

我們編寫業務代碼的時候,可能很少人會使用到AST,以至于大多數同學都不大了解AST。有的同學曾經學過,但是不去實踐的話,過段時間又忘的差不多了。看到這里,你會發現說的就是你。聽說貴圈現在寫文章都要編故事,時不時還要整點表情包。這是真的嗎?作為公司最頭鐵的前端,我就不放。

本文將通過以下幾個方面對AST進行學習

1.基礎知識

  • AST是什么
  • AST有什么用
  • AST如何生成

2.實戰小例子

  • 去掉debugger
  • 修改函數中執行的console.log參數

3.總結

基礎知識

AST是什么先貼下官方的解釋

  • 在計算機科學中,抽象語法樹(abstract syntax tree 或者縮寫為 AST),或者語法樹(syntax tree),是源代碼的抽象語法結構的樹狀表現形式,這里特指編程語言的源代碼。

為了方便大家理解抽象語法樹,來看看具體的例子。

  1. var tree = 'this is tree' 

js 源代碼將會被轉化成下面的抽象語法樹

  1.   "type""Program"
  2.   "start": 0, 
  3.   "end": 25, 
  4.   "body": [ 
  5.     { 
  6.       "type""VariableDeclaration"
  7.       "start": 0, 
  8.       "end": 25, 
  9.       "declarations": [ 
  10.         { 
  11.           "type""VariableDeclarator"
  12.           "start": 4, 
  13.           "end": 25, 
  14.           "id": { 
  15.             "type""Identifier"
  16.             "start": 4, 
  17.             "end": 8, 
  18.             "name""tree" 
  19.           }, 
  20.           "init": { 
  21.             "type""Literal"
  22.             "start": 11, 
  23.             "end": 25, 
  24.             "value""this is tree"
  25.             "raw""'this is tree'" 
  26.           } 
  27.         } 
  28.       ], 
  29.       "kind""var" 
  30.     } 
  31.   ], 
  32.   "sourceType""module" 

可以看到一條語句由若干個詞法單元組成。這個詞法單元就像 26 個字母。創造出個十幾萬的單詞,通過不同單詞的組合又能寫出不同內容的文章。

至于有哪些詞法單元可點擊查看AST 對象文檔 或者 參考掘金大佬的文章高級前端基礎-JavaScript 抽象語法樹 AST里面列舉了語法樹節點與解釋。

推薦一個工具 在線 ast 轉換器。可以在這個網站上,親自嘗試下轉換。點擊語句中的詞,右邊的抽象語法樹節點便會被選中,如下圖:

AST 有什么用

  • IDE 的錯誤提示、代碼格式化、代碼高亮、代碼自動補全等
  • JSLint、JSHint 對代碼錯誤或風格的檢查等
  • webpack、rollup 進行代碼打包等
  • CoffeeScript、TypeScript、JSX 等轉化為原生 Javascript.
  • vue 模板編譯、react 模板編譯

AST 如何生成

看到這里,你應該已經知道抽象語法樹大致長什么樣了。那么AST又是如何生成的呢?

AST 整個解析過程分為兩個步驟

  • 詞法分析 (Lexical Analysis):掃描輸入的源代碼字符串,生成一系列的詞法單元 (tokens)。這些詞法單元包括數字,標點符號,運算符等。詞法單元之間都是獨立的,也即在該階段我們并不關心每一行代碼是通過什么方式組合在一起的。
  • 語法分析 (Syntax Analysis):建立分析語法單元之間的關系

還是以上面var tree = 'this is tree'為例

正規理解

詞法分析

先經過詞法分析,掃描輸入的源代碼字符串,生成一系列的詞法單元 (tokens)。這些詞法單元包括數字,標點符號,運算符等

 

語法分析

語法分析階段就會將上一階段生成的 tokens 列表轉換為如下圖所示的 AST(我把start、end字段去掉了不用在意)

非正規理解

鄭重聲明:我周某人語文很少及格,大致意思能理解就好。

例子:"它是豬。"

詞法分析

先經過詞法分析,掃描輸入的源代碼字符串,生成一系列的詞法單元 (tokens)。這些詞法單元包括數字,標點符號,運算符等

語法分析

語法分析階段就會將上一階段生成的 tokens 列表轉換為如下圖所示的 AST

JsParser

JavaScript Parser,把 js 源碼轉化為抽象語法樹的解析器。

  • acorn
  • esprima
  • traceur
  • @babel/parser

實戰小例子

例子 1:去 debugger

源代碼:

  1. function fn() { 
  2.   console.log('debugger'
  3.   debugger; 

根據前面學過的知識點,我們先腦海中意淫下如何去掉這個debugger

  1. 先將源代碼轉化成AST
  2. 遍歷**AST**上的節點,找到**debugger**節點,并刪除
  3. 將轉換過的AST再生成JS代碼

將源代碼拷貝到 在線 ast 轉換器 中,并點擊左邊區域的debugger,可以看到左邊的debugger節點就被選中了。所以只要把圖中選中的debugger抽象語法樹節點刪除就行了。

這個例子比較簡單,直接上代碼。

這個例子我使用@babel/parser、@babel/traverse、@babel/generator,它們的作用分別是解析、轉換、生成。

  1. const parser = require('@babel/parser'); 
  2. const traverse = require("@babel/traverse"); 
  3. const generator = require("@babel/generator"); 
  4.  
  5. // 源代碼 
  6. const code = ` 
  7. function fn() { 
  8.   console.log('debugger'
  9.   debugger; 
  10. `; 
  11.  
  12. // 1. 源代碼解析成 ast 
  13. const ast = parser.parse(code); 
  14.  
  15.  
  16. // 2. 轉換 
  17. const visitor = { 
  18.   // traverse 會遍歷樹節點,只要節點的 type 在 visitor 對象中出現,變化調用該方法 
  19.   DebuggerStatement(path) { 
  20.     // 刪除該抽象語法樹節點 
  21.     path.remove(); 
  22.   } 
  23. traverse.default(ast, visitor); 
  24.  
  25. // 3. 生成 
  26. const result = generator.default(ast, {}, code); 
  27.  
  28. console.log(result.code) 
  29.  
  30. // 4. 日志輸出 
  31.  
  32. // function fn() { 
  33. //   console.log('debugger'); 
  34. // } 

babel核心邏輯處理都在visitor里。traverse會遍歷樹節點,只要節點的type在visitor對象中出現,便會調用該type對應的方法,在方法中調用path.remove()將當前節點刪除。demo中使用到的path的一些api可以參考babel-handbook。

例子 2:修改函數中執行的 console.log 參數

我們有時候在函數里打了日志,但是又想在控制臺直觀的看出是哪個函數中打的日志,這個時候就可以使用AST,去解析、轉換、生成最后想要的代碼。

源代碼:

  1. function funA() { 
  2.  console.log(1) 
  3.  
  4. // 轉換成 
  5.  
  6. function funA() { 
  7.  console.log('from function funA:', 1) 

在編碼之前,我們先理清思路,再下手也不遲。這個時候就需要借助 在線 ast 轉換器來分析了。

通過工具發現想要實現這個案例只需要往arguments前面插入段節點就可以了。

這里也像例子 1 一樣先梳理下思路

  1. 使用 @babel/parser 將源代碼解析成 ast
  2. 監聽 @babel/traverse 遍歷到 CallExpression
  3. 觸發后,判斷如果執行的方法是 console.log 時,往 arguments unshift一個 StringLiteral
  4. 將轉換后的 ast 生成代碼

將 js 代碼解析成 ast 與 將 ast 生成 js 代碼與去 debugger 例子一致,這里將不再描述。

首先監聽CallExpression遍歷

  1. const visitor = { 
  2.   CallExpression(path) { 
  3.     // console.log(path) 
  4.   } 

觀察 在線 ast 轉換器 解析后的樹,我們只要判斷path 的 callee中存在對象 console 及屬性 property 。就可以往當前的 path 的 arguments unshift 一個 StringLiteral

這里的 types 對象是使用了一個新包 @babel/types , 用來判斷類型。

上面用到的isMemberExpression,isIdentifier,getFunctionParent,stringLiteral都可以在babel-handbook文檔中找到,本文就不解釋了。

  1. const visitor = { 
  2.   // 當遍歷到 CallExpression 時候觸發 
  3.   CallExpression(path) { 
  4.     const callee = path.node.callee; 
  5.     // 判斷當前當前執行的函數是否是組合表達式 
  6.     if (types.isMemberExpression(callee)) { 
  7.       const { object, property } = callee; 
  8.       if (types.isIdentifier(object, { name'console' }) && types.isIdentifier(property, { name'log' })) { 
  9.         // 查找最接近的父函數或程序 
  10.         const parent = path.getFunctionParent(); 
  11.         const parentFunName = parent.node.id.name
  12.         path.node.arguments.unshift(types.stringLiteral(`from function ${parentFunName}`)) 
  13.       } 
  14.     } 
  15.   } 

總結

就像前言所說的,我們的日常工作中很少會去使用AST,以至于大多數同學都不大了解AST。但了解了 AST 可以幫助我們更好地理解開發工具、編譯器的原理,并產出提高代碼效率的工具。還記得我在之前的前端小組遇到一個問題,我們項目是SSR項目,在服務端執行的生命周期不允許出現客戶端才能執行的代碼。但是小組成員有時候無意的寫了,導致服務端渲染降級。在學習AST之前,我為了解決這個問題,寫了個loader通過正則去匹配校驗,當時可真是逼死我了,正則需要去適配各種場景。后面我學習了AST了之后,編寫了個eslint插件實現了客戶端代碼校驗。

參考

  • babel-handbook(https://github.com/jamiebuilds/babel-handbook/blob/master/translations/zh-Hans/plugin-handbook.md)
  • 深入 Babel,這一篇就夠了(https://juejin.im/post/6844903746804137991)
  • 高級前端基礎-JavaScript 抽象語法樹 AST(https://juejin.cn/post/6844903798347939853#heading-12)

 

責任編輯:姜華 來源: 微醫大前端技術
相關推薦

2011-03-29 15:44:41

對日軟件外包

2019-04-03 09:10:35

Rediskey-value數據庫

2019-11-21 15:08:13

DevOps云計算管理

2010-08-19 10:12:34

路由器標準

2017-12-26 11:37:32

云原生CNCF容器

2025-08-06 06:15:00

2013-11-11 10:07:43

靜態路由配置

2018-07-16 09:00:32

LinuxBash數組

2015-06-05 09:52:41

公有云風險成本

2017-03-13 17:25:00

移動支付技術支撐易寶

2025-08-28 06:05:00

2023-02-16 07:38:38

非機械鍵電路薄膜,

2019-05-14 14:51:40

Java語法糖用法

2020-09-16 07:59:40

數組內存

2020-04-20 10:55:57

大數據人工智能技術

2020-11-30 06:27:35

Java泛型Object

2012-02-21 09:20:50

Hadoop大數據

2021-01-14 08:31:54

Web開發應用程序

2010-07-27 09:00:32

MySQL鎖

2020-12-10 08:13:15

ARM架構 嵌入式
點贊
收藏

51CTO技術棧公眾號

香蕉久久夜色精品国产更新时间| 91精品久久久久久粉嫩| 日韩精品成人一区二区三区| 中文字幕亚洲图片| 红桃视频一区二区三区免费| eeuss鲁一区二区三区| 国产欧美日韩亚州综合| 91九色对白| 亚洲成熟少妇视频在线观看| 欧美不卡视频| 亚洲人成在线播放| 色哟哟在线观看视频| 亚洲欧美se| 亚洲男人天堂av| 欧美日韩免费高清| 亚洲AV午夜精品| 日本中文字幕一区二区视频 | 成人免费视频97| 五月天婷婷综合网| 婷婷亚洲最大| 亚洲欧美制服第一页| 日本亚洲一区二区三区| 欧美成人资源| 亚洲国产视频a| 中国人体摄影一区二区三区| 欧美3p视频在线观看| 国产v综合v亚洲欧| 成人在线国产精品| 91青青草视频| 国产欧美日本| 欧美激情精品久久久久久| 女教师淫辱の教室蜜臀av软件| 欧美大胆视频| 精品久久久久久久久久久久包黑料 | 精品91免费| 精品人妻一区二区三区蜜桃| 另类人妖一区二区av| 日本亚洲欧洲色α| 日韩和一区二区| 欧美日韩亚洲一区在线观看| 美女精品视频一区| 久久中文免费视频| 久久久国产精品| 日韩亚洲在线观看| 五月综合色婷婷| 国产精品二区不卡| 精品国产美女在线| 亚洲欧美精品久久| 91精品观看| 欧美www在线| www.99re7| 欧美日韩国产一区精品一区| 久久天天躁狠狠躁夜夜躁2014| www.com.av| 久久在线视频免费观看| 日韩中文有码在线视频| 青青操在线播放| 欧美国产一级| 久久久精品国产网站| 四虎永久免费地址| 综合精品一区| 国内精品久久久久久中文字幕 | 91豆麻精品91久久久久久| 虎白女粉嫩尤物福利视频| xx欧美视频| 欧美性色aⅴ视频一区日韩精品| 天天操,天天操| 视频91a欧美| 欧美一区二区在线不卡| 中国特级黄色片| 欧美a大片欧美片| 亚洲色图第三页| 永久免费观看片现看| 久久久久亚洲| 高清亚洲成在人网站天堂| 久久狠狠高潮亚洲精品| 噜噜噜久久亚洲精品国产品小说| 国产成人精品免费视频| 国产一区二区在线不卡| 国产成人99久久亚洲综合精品| 国产精品一区二区av| 午夜国产在线观看| 国产精品嫩草99a| 欧美做暖暖视频| 深夜国产在线播放| 色综合中文综合网| 91 视频免费观看| 精品福利一区| 在线观看日韩av| 久草视频免费播放| 先锋影音久久| 国产一区二中文字幕在线看| 成人免费视频国产免费麻豆| 国产性色一区二区| 国产在线xxxx| 国产一区一一区高清不卡| 日韩欧美123| 亚洲区自拍偷拍| 欧美涩涩网站| 国产精品久久一| 人妻无码中文字幕免费视频蜜桃| 国产精品午夜电影| 欧美一级视频免费看| 国产成人久久精品麻豆二区| 亚洲国产欧美一区二区三区久久| 97精品在线播放| 亚洲一区自拍| 97久久人人超碰caoprom欧美| 欧美理论在线观看| 亚洲无人区一区| 日韩av自拍偷拍| 精品中文字幕一区二区三区av| 久青草国产97香蕉在线视频| 亚洲 欧美 日韩 在线| 东方aⅴ免费观看久久av| 午夜精品一区二区在线观看| 乱人伦视频在线| 日韩欧美亚洲一区二区| 1024在线看片| 免费久久99精品国产自在现线| 91九色偷拍| 欧美激情视频在线播放| 色香蕉成人二区免费| 成人做爰69片免费| 重囗味另类老妇506070| 国产精品视频播放| 精品一二三区视频| 欧美色另类天堂2015| 中国男女全黄大片| 亚洲中无吗在线| 国产主播欧美精品| 日本三级在线视频| 精品视频一区二区三区免费| 亚洲国产天堂av| 久久免费黄色| 久久久综合香蕉尹人综合网| 2020av在线| 亚洲成人xxx| 国产亚洲精品久久久久久打不开| 国产综合一区二区| 中文精品一区二区三区 | 99精品久久| 国产精品一 二 三| 91九色国产在线播放| 日韩免费观看高清完整版 | 亚洲天堂黄色| 国产九色精品| 多野结衣av一区| 欧美精品一区二区高清在线观看| 国产一级久久久| 成人美女在线视频| 欧美视频免费看欧美视频| 九九热hot精品视频在线播放| 欧美激情在线狂野欧美精品| 欧美一区二区三区成人片在线| 香蕉久久一区二区不卡无毒影院| 国产伦精品一区二区三区精品| 亚洲午夜伦理| 精品人伦一区二区三区| 亚洲女同志freevdieo| 亚洲女人天堂视频| www.av88| 成人欧美一区二区三区黑人麻豆 | 黄色片网址在线观看| 天美av一区二区三区久久| 国产a∨精品一区二区三区不卡| 黄网在线免费| 欧美日韩成人综合天天影院| 国产va在线播放| 99热精品一区二区| 欧美一级裸体视频| 91精品天堂福利在线观看| 999国内精品视频在线| a级片在线免费观看| 亚洲免费一在线| 国产一区二区三区中文字幕| 亚洲午夜精品17c| 性欧美丰满熟妇xxxx性仙踪林| 日韩av电影一区| 国产尤物av一区二区三区| 欧美深夜视频| 国产日韩欧美另类| 毛片大全在线观看| 伊人精品在线观看| www.黄色小说.com| 欧美午夜无遮挡| 国产天堂av在线| 99久久久免费精品国产一区二区| 九热视频在线观看| 伊人影院久久| 亚洲国产一区二区三区在线| 在线精品视频一区| 国产精品久久久久国产a级| 免费在线国产视频| 中日韩午夜理伦电影免费| 精品欧美在线观看| 91成人免费在线| 久久成人国产精品入口| 中文字幕免费在线观看视频一区| 国产精品熟妇一区二区三区四区| 日本不卡一区二区三区高清视频| av在线免费观看国产| 成人羞羞动漫| 国产一区二区三区色淫影院| 色综合久久久| 国产精品18久久久久久首页狼| 欧美日韩在线视频免费观看| 尤物九九久久国产精品的特点| 成人午夜精品福利免费| 欧美日韩精品欧美日韩精品一综合| 国产精品成人aaaa在线| 最新高清无码专区| 天天干天天舔天天操| 99视频热这里只有精品免费| 五月六月丁香婷婷| 蜜臀久久99精品久久久久久9| av在线播放亚洲| 欧美二区视频| 亚洲欧洲精品一区二区| 视频国产一区| 久久久久九九九| 国产精品对白| 91精品国产一区二区三区动漫| 欧美成人毛片| 国产欧美精品一区二区| 欧美大片免费| 热99精品只有里视频精品| 国产羞羞视频在线播放| 久久中文久久字幕| 久久日韩视频| 国产一区二区日韩| 欧洲一区av| 日韩精品在线视频| 婷婷伊人综合中文字幕| 精品日本一线二线三线不卡 | 日韩毛片在线观看| 国产91免费在线观看| 欧美xxxxxxxxx| www.亚洲天堂.com| 精品日本一线二线三线不卡| 精品久久久无码中文字幕| 欧美精品1区2区3区| 中文字幕乱码视频| 欧美日韩精品久久久| 中国黄色一级视频| 欧美日韩精品一区二区| 在线观看国产精品视频| 在线成人av网站| av中文在线观看| 日韩精品一区二区三区四区视频 | 国产成人丝袜美腿| 美女又黄又免费的视频| 国产成人精品免费| 中文字幕在线播放一区| wwwwww.欧美系列| 成人黄色免费网址| 国产精品美女一区二区三区| 日本午夜在线观看| 亚洲一区av在线| 日韩中文字幕在线观看视频| 色www精品视频在线观看| 无码一区二区三区| 欧美久久久久久蜜桃| 国产麻豆91视频| 精品国产第一区二区三区观看体验| 欧美自拍偷拍第一页| 日韩av中文字幕在线免费观看| 四虎影院在线域名免费观看| 亚洲精品视频在线播放| аⅴ资源新版在线天堂| 久热在线中文字幕色999舞| 丝袜美腿av在线| 97人人爽人人喊人人模波多| 三上悠亚激情av一区二区三区| 国产一区二区在线播放| 北条麻妃一区二区三区在线观看| 国产视频一区二区不卡| 欧美日韩在线二区| 超碰超碰超碰超碰超碰| 99精品热6080yy久久| 五月天激情视频在线观看| 国产高清在线精品| 国产精品无码一区二区三区| 国产精品久久毛片a| 日本中文字幕网| 欧美无砖专区一中文字| 刘玥91精选国产在线观看| 国产亚洲精品成人av久久ww| 中国av在线播放| 日韩av免费看| 色悠久久久久综合先锋影音下载| 欧美成人蜜桃| 欧美精选在线| 日韩一级理论片| av一区二区不卡| 日韩精品123区| 一本色道**综合亚洲精品蜜桃冫| 国产人妖一区二区| 亚洲天堂男人天堂| 美足av综合网| 国产在线拍揄自揄视频不卡99| 久久视频在线观看| 欧洲金发美女大战黑人| 视频一区二区三区中文字幕| 日本精品一二三| 国产精品成人网| 中文字幕在线观看视频免费| 精品少妇一区二区三区在线播放| 91福利在线视频| 日韩av手机在线| 久久av国产紧身裤| 国产 国语对白 露脸| 免费在线欧美视频| 亚洲av无码一区二区二三区| 亚洲高清在线精品| 99热这里只有精品9| 日韩视频一区在线| 成人视屏在线观看| 狠狠干一区二区| 韩日成人在线| 黄色片免费网址| 自拍偷拍亚洲综合| 中文字幕码精品视频网站| 亚洲欧洲午夜一线一品| 人人草在线视频| 国产精品xxxx| 激情国产一区| 国产乱淫av麻豆国产免费| 综合图区亚洲| 欧美丰满老妇厨房牲生活| 99久久精品一区二区成人| 欧美福利精品| 99热精品在线| 久久人妻少妇嫩草av无码专区| 一区二区在线看| 国产人妻精品一区二区三区| 日韩在线一区二区三区免费视频| 怡红院成人在线| 欧美日韩国产精品一卡| 欧美亚洲三级| 欧美激情aaa| 欧美视频一二三| 色视频在线观看福利| 4438全国成人免费| 午夜精品影视国产一区在线麻豆| 欧美国产激情视频| 久久一区二区三区四区| 激情视频网站在线观看| 亚洲欧美成人精品| 色8久久影院午夜场| 午夜精品福利一区二区| 男人的天堂亚洲一区| 五月婷婷欧美激情| 欧美日韩中文字幕一区| 午夜免费视频在线国产| 成人国产精品久久久久久亚洲| 一区二区在线| 男人操女人下面视频| 一区二区三区日本| 天天操天天射天天舔| 欧美性资源免费| 国产一区二区三区电影在线观看| 91人人澡人人爽人人精品| 亚洲啪啪综合av一区二区三区| 成人午夜视频一区二区播放| 4438全国亚洲精品在线观看视频| 精品美女视频| 欧美xxxxxbbbbb| 精品国产乱码久久久久酒店 | 深夜福利一区二区| 99视频这里有精品| 2018国产在线| 欧美极品少妇xxxxⅹ高跟鞋 | 亚洲欧洲一二三| 国产一区999| 国产超碰人人爽人人做人人爱| 国产亚洲欧美视频| 国产亚洲高清在线观看| 国产精品50p| 中文字幕在线观看一区| 丰满人妻av一区二区三区| 欧美在线免费观看| 五月天综合网站| 先锋资源av在线| 欧美三级视频在线播放| 欧美大胆的人体xxxx| 欧美在线日韩精品| 国产成人精品www牛牛影视| 亚洲第一网站在线观看| 免费不卡欧美自拍视频| 一个色免费成人影院| 九九久久久久久| 一本大道av一区二区在线播放| av文字幕在线观看| 欧美午夜视频在线| 高清shemale亚洲人妖| 中文字幕av影视| 91大神福利视频在线| 久久久久电影| 精品无码在线观看|