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

深入對比 eslint 插件 和 babel 插件的異同點

開發 前端
babel 插件和 eslint 插件都能夠分析和轉換代碼,那這倆到底有啥不同呢?

 [[421277]]

babel 和 eslint 都是基于 AST 的,一個是做代碼的轉換,一個是做錯誤檢查和修復。babel 插件和 eslint 插件都能夠分析和轉換代碼,那這倆到底有啥不同呢?

本文我們來探究下 babel 插件和 eslint 插件差別在哪里。

babel 插件

babel 的編譯流程分為 parse、transform、generate 3 步,可以指定插件,在遍歷 AST 的時候會合并調用 visitor。

比如我們寫一個在 console.xx 的參數插入文件名 + 行列號的插件:

對函數調用節點(CallExpression)的 callee 屬性進行檢查,如果是 console.xx 的 api,則在 arguments 中插入一個 StringLiteral 的字符串字面量節點,值為文件名 + 行列號。

  1. const targetCalleeName = ['log''info''error''debug'].map(item => `console.${item}`); 
  2.  
  3. const parametersInsertPlugin = ({ types }, options) => { 
  4.     return { 
  5.         visitor: { 
  6.             CallExpression(path, state) { 
  7.                 const calleeName = path.get('callee').toString() 
  8.                 if (targetCalleeName.includes(calleeName)) { 
  9.                    const { line, column } = path.node.loc.start; 
  10.                    path.node.arguments.unshift(types.stringLiteral(`${options.file.filename}: (${line}, ${column})`)) 
  11.                } 
  12.             } 
  13.         } 
  14.     } 
  15. module.exports = parametersInsertPlugin; 

然后使用 babel core 的 api 進行代碼編譯,并調用插件:

  1. const { transformFileSync } = require('@babel/core'); 
  2. const insertParametersPlugin = require('./plugin/parameters-insert-plugin'); 
  3. const path = require('path'); 
  4.  
  5. const inputFilePath = path.join(__dirname, './sourceCode.js'); 
  6.  
  7. const { code } = transformFileSync(inputFilePath, { 
  8.     plugins: [insertParametersPlugin], 
  9.     parserOpts: { 
  10.         sourceType: 'unambiguous'
  11.         plugins: ['jsx'
  12.     } 
  13. }); 
  14.  
  15. console.log(code); 

當源碼為下面的代碼時:

  1. console.log(1); 
  2.  
  3. function func() { 
  4.     console.info(2); 
  5.  
  6. export default class Clazz { 
  7.     say() { 
  8.         console.debug(3); 
  9.     } 
  10.     render() { 
  11.         return <div>{console.error(4)}</div> 
  12.     } 

目標代碼為:

 

 

 

 

可以看到,在 console.xx 的 api 調用處插入了文件名和行列號的參數。

這就是一個 babel 插件做代碼轉換的例子。

我們從中能總結出 babel 插件的特點:

  • 插件的形式是函數返回一個對象,對象的 visitor 屬性聲明對什么節點做什么處理

  • visitor 函數可以通過 path 的 api 來對 ast 增刪改

  • 修改后的 ast 會打印成目標代碼

eslint 插件

eslint 插件也會對代碼進行 parse,查找要檢查的 AST,之后進行檢查和報錯,但不一定會修復代碼,只有指定了 fix 才會進行修復。

我們寫一個檢查對象格式的 eslint 插件。

需求時把下面的代碼格式進行檢查和修復:

  1. const  obj = { 
  2.     a: 1,b: 2
  3.  
  4.     c: 3 

變成這種:

  1. const  obj = { 
  2.     a: 1
  3.     b: 2
  4.     c: 3 

eslint 是可以查找某個 AST 關聯的 token 的,也就是我們可以拿到對象的每一個屬性開始和結束的 token 還有行列號,

我們要校驗上一個屬性結束的 token 的行號要等于下一個屬性開始的 token 的行號。

所以就是這樣寫:

指定對 ObjectExpression 也就是 {} 表達式的每一個屬性的開始和結束 token 的行號做檢查,如果不是下一個屬性是上一個屬性的 +1 行,那就報錯。

并且,還可以指定如何修復,我們這里的錯誤的修復方式就是把兩個 token 之間的部分替換為換行符(os.EOL) + tab。

  1. const os = require('os'); 
  2.  
  3. module.exports = { 
  4.      meta: { 
  5.          fixable: true 
  6.      }, 
  7.      create(context) { 
  8.          const sourceCode = context.getSourceCode(); 
  9.          return { 
  10.             ObjectExpression(node) { 
  11.                 for (let i = 1; i < node.properties.length; i ++) { 
  12.                      const firstToken = sourceCode.getTokenAfter(node.properties[i - 1]); 
  13.                      const secondToken = sourceCode.getFirstToken(node.properties[i]); 
  14.                      if(firstToken.loc.start.line !== secondToken.loc.start.line - 1) { 
  15.                         context.report({ 
  16.                             node, 
  17.                             message: '對象屬性之間不能有空行'
  18.                             loc: firstToken.loc, 
  19.                             *fix(fixer) { 
  20.                                 yield fixer.replaceTextRange([firstToken.range[1],secondToken.range[0]], os.EOL + '\t'); 
  21.                             } 
  22.                         }); 
  23.                      } 
  24.                       
  25.                 } 
  26.              } 
  27.          }; 
  28.      } 
  29.  }; 

這樣就完成了對象格式的檢查和自動修復。

這個插件文件名命名為 object-property-format,然后我們使用 api 的方式調用下:

首先,引入 eslint 模塊,創建 ESLint 對象:

  1. const { ESLint } = require("eslint"); 
  2.  
  3. const engine = new ESLint({ 
  4.     fix: false
  5.     overrideConfig: { 
  6.         parser: '@babel/eslint-parser'
  7.         parserOptions: { 
  8.             sourceType: "unambiguous"
  9.             requireConfigFile: false
  10.         }, 
  11.         rules: { 
  12.             "object-property-format""error" 
  13.         } 
  14.     }, 
  15.     rulePaths: ['./'], 
  16.     useEslintrc: false 
  17. }); 

這里把配置文件關掉(useEslintrc: false),只用這里的的配置(overrideConfig)。

我們指定用 babel 的 parser(@babel/eslint-parser),并且不需要 babel 配置文件。之后引入剛才我們寫的那個 rule,也就是 object-property-format,報錯級別設置為 error。

還需要指定 rulePaths,也就是告訴 eslint 去哪里查找 rule。

之后,我們調用 lintText 的 api 進行 lint:

  1. (async function main() { 
  2.   const results = await engine.lintText(` 
  3.   const  obj = { 
  4.         a: 1,b: 2
  5.  
  6.         c: 3 
  7.     } 
  8.   `); 
  9.  
  10.   console.log(results[0].output); 
  11.  
  12.   const formatter = await engine.loadFormatter("stylish"); 
  13.   const resultText = formatter.format(results); 
  14.   console.log(resultText); 
  15. })() 

對于結果,我們使用內置的 formater 格式化了一下。

用 node 執行,結果如下:

 

 

 

 

可以看到,eslint 檢查出了對象格式的兩處錯誤。

為什么沒有修復呢?因為沒開啟 fix 啊,eslint 需要開啟 fix 才會修復代碼。

把 Eslint 的 fix option 修改為 true,再試一下:

 

 

 

 

可以看到,沒有報錯了,而且代碼也進行了修復。

這就是一個 eslint 插件做代碼格式檢查和修復的例子。

我們從中總結出 eslint 插件的 rule 的特點:

  • rule 的形式是對象,create 屬性是一個函數,返回一個對象,指定對什么 AST 做什么檢查和修復

  • AST 處理函數可以通過 context 的 api 來拿到源碼不同位置的 token 來進行格式的檢查

  • fix 函數可以拿到 fixer 的 api,來對某個位置的代碼進行字符的增刪改

  • 默認不會修復代碼,需要指定 fix 才會進行修復

eslint 插件和 babel 插件的異同

我們把總結的 babel 插件和 eslint 插件的特點拿到一起對比下。(這里的 eslint 插件嚴格來說是指的 eslint 的 rule,eslint 插件可以包含多個 rule。)

babel 插件:

  • 插件的形式是函數返回一個對象,對象的 visitor 屬性聲明對什么節點做什么處理

  • visitor 函數可以通過 path 的 api 來對 ast 增刪改

  • 修改后的 ast 會打印成目標代碼

eslint 插件:

  • rule 的形式是對象,create 屬性是一個函數,返回一個對象,指定對什么 AST 做什么檢查和修復

  • AST 處理函數可以通過 context 的 api 來拿到源碼不同位置的 token 來進行格式的檢查

  • fix 函數可以拿到 fixer 的 api,來對某個位置的代碼進行字符的增刪改

  • 默認不會修復代碼,需要指定 fix 才會進行修復

我們來對比下兩者的異同:

  • 從形式上來說,eslint 的 rule 是對象-函數-對象的形式,而 babel 插件是函數-對象的形式,多的部分是 eslint rule 的元信息,也就是 meta 屬性。這是兩者設計上的不同。

  • babel 插件和 eslint rule 都可以遍歷節點,指定對什么節點做處理,但是 babel 插件可以通過 path 的 api 來增刪改 AST,而 eslint 則是通過 context.getSourceCode() 拿到 sourceCode,然后通過 sourceCode 的 api 進行格式的檢查,最后修復還要通過 fixer 的 api。

  • babel 插件的改動默認就是生效的,最多傳入 options 進行控制,而 eslint 的 fix 功能只有開啟才生效。

eslint 的 AST 中記錄了在源碼中 range 信息,可以根據 range 信息查找 token,但其實 babel 也可以,babel parser 也可以指定 ranges、tokens

 

 

 

 

也就是說理論上基于 babel 完全可以實現 eslint 的功能,只不過兩者 api 設計上的不同,導致了兩者適合的場景不同。

  • babel 是通過 path api 進行 AST 增刪改,適合做代碼分析和轉換。

  • eslint 是通過 sourceCode 和 fixer api 進行代碼格式的檢查和 fix,適合做錯誤檢查和修復。

但是,從本質上來說,兩者編譯流程上差別并不大。

總結

我們寫了一個在 console.xx api 插入參數的 babel 插件,又寫了一個檢查和修復對象格式的 eslint 插件,分析了兩者的特點,然后做了下對比。

兩者插件形式上不同,api 也不同:

babel 是通過 path 的 api 對 AST 進行增刪改,而 eslint 是通過 sourceCode 的 api 進行代碼格式的檢查,通過 fixer 的 api 進行修復。這就導致了 babel 插件更適合做代碼轉換,eslint 插件更適合做代碼格式的校驗和修復。但實際上 babel 也能做到 eslint 一樣的事情,兩者本質上的編譯流程是差不多的。

這篇文章把 babel 插件和 eslint 插件放到一起進行了對比,講述了兩者本質的相同和 api 的不同,希望能夠幫大家更好的掌握 babel 和 eslint 插件。

 

責任編輯:張燕妮 來源: 神光的編程秘籍
相關推薦

2021-09-02 13:38:48

Eslint Babel 插件

2021-11-19 23:54:19

插件Eslint

2009-11-06 10:11:34

WCF和Web Ser

2015-05-22 09:49:25

2009-12-18 15:23:03

Vista和XP路由設

2021-10-13 22:19:16

插件Babel import

2012-12-07 10:56:32

2010-06-13 09:18:28

UML依賴

2021-09-11 19:46:14

配置

2009-12-29 15:56:57

2022-01-18 18:46:55

Eslint抽象語法樹Babel

2022-07-18 14:18:26

Babel代碼面試

2022-09-30 15:46:26

Babel編譯器插件

2012-11-22 13:02:24

jQuery插件Web

2009-11-10 11:25:35

VB.NET與Basi

2021-06-22 06:52:46

Vite 插件機制Rollup

2009-12-11 10:29:03

PHP插件機制

2021-09-05 11:37:31

Eslint插件Vue

2010-08-11 16:37:47

DB2數據庫

2009-11-11 13:59:15

ADO.NET與ADO
點贊
收藏

51CTO技術棧公眾號

国产网友自拍视频导航网站在线观看| 青娱乐在线视频免费观看| 女海盗2成人h版中文字幕| 国产精品77777| 欧美成年人视频网站欧美| 天天干天天玩天天操| 欧美日韩国产综合视频| 噜噜噜躁狠狠躁狠狠精品视频| 日韩精品亚洲元码| 91免费视频网站在线观看| 欧美日韩视频精品二区| 久久精品在线| 日韩在线欧美在线国产在线| 超碰在线超碰在线| 美女日批视频在线观看| 成人手机电影网| 欧美性受xxxx白人性爽| 亚洲一区 欧美| 精品国产鲁一鲁****| 中文字幕一区二区三区不卡| 成人动漫视频在线观看完整版| 日本一级黄色录像| av一区二区高清| 91精品福利在线一区二区三区 | 少妇视频一区二区| 国产精品一区免费在线| 亚洲成av人片| 日韩中文一区二区三区| 国产精品高潮呻吟久久久| 欧美高清一区| 亚洲图片制服诱惑| 95视频在线观看| 免费在线观看一区| 亚洲亚洲人成综合网络| 日本一区二区精品视频| 国产精品久久久久久久成人午夜 | 亚洲欧美一区二区三区在线| 少妇网站在线观看| av中文字幕在线观看第一页| 国产精品天天看| 国产伦理一区二区三区| 亚洲一区二区影视| 亚洲视频www| 欧美日本啪啪无遮挡网站| 色无极影院亚洲| 亚洲不卡视频| 欧美色精品天天在线观看视频| 国产真实老熟女无套内射| 国产精品毛片一区二区三区四区| 国产成人精品综合在线观看| 国产精品久久综合av爱欲tv| 日韩欧美三级在线观看| 91精品精品| 国产亚洲美女久久| 伊人网综合视频| 国产专区精品| 欧美日韩一区不卡| 黄色国产一级视频| 日本资源在线| 亚洲欧美日韩小说| 亚洲欧洲另类精品久久综合| 日本精品久久久久| 国产乱国产乱300精品| 国产成人精品久久久| 久久久久久久久99| 一个色综合网| 久久久国产影院| 长河落日免费高清观看| 蜜桃tv一区二区三区| 亚洲精品wwww| 性色av蜜臀av浪潮av老女人 | 亚洲精品97| 丝袜亚洲欧美日韩综合| 久久久男人的天堂| 国产精品网址| 精品国产三级电影在线观看| 中文 日韩 欧美| 青青草国产一区二区三区| 欧美日韩一区中文字幕| 妓院一钑片免看黄大片| 亚洲优女在线| 欧美手机在线视频| 三区视频在线观看| 一区二区三区四区视频免费观看 | 成人18在线| 国产精品久线观看视频| 国产内射老熟女aaaa| 91桃色在线| 一本一道综合狠狠老| 欧美性猛交xxx乱久交| 91精品网站在线观看| 欧美videos中文字幕| 亚洲最大的黄色网| 欧美一级精品| 久久99久久久久久久噜噜| 日本在线观看中文字幕| 首页国产欧美久久| 91人成网站www| 五月婷婷在线播放| 欧美国产精品一区| 欧美黄色免费网址| 亚洲成人av观看| 日韩欧美视频一区| 99久久久无码国产精品衣服| 你懂的国产精品永久在线| 38少妇精品导航| 国产精品国产精品国产专区| 26uuu欧美| 久久免费一级片| 欧美xx视频| 精品国产sm最大网站| 摸摸摸bbb毛毛毛片| 欧美在线播放| 国产精品91久久| 精品黑人一区二区三区在线观看 | 日韩欧美的一区| 亚洲av成人无码久久精品| 亚洲一区二区三区无吗| 欧美最猛黑人xxxx黑人猛叫黄| 国产又大又粗又长| 欧美—级在线免费片| 男人添女荫道口图片| 亚洲伦理久久| 国产亚洲福利一区| 在线观看免费国产视频| 国产一区二区三区不卡在线观看| 鲁丝片一区二区三区| 四季久久免费一区二区三区四区| 欧美怡红院视频| aa片在线观看视频在线播放| 欧美福利一区| 成人免费视频在线观看超级碰| 秋霞av在线| 天天综合色天天综合| 一级黄色免费毛片| 97精品国产福利一区二区三区| 欧美一区二区三区免费视| 亚洲精品国产suv一区| 国产精品不卡视频| 一区二区三区国产免费| 杨幂一区二区三区免费看视频| 欧美极品欧美精品欧美视频| 色综合一区二区| 免费成人蒂法网站| 激情另类综合| 国产伦精品一区二区三区| 91精品国产91久久久久久青草| 在线观看日韩国产| 欧美做受xxxxxⅹ性视频| 一区二区三区导航| 国产另类自拍| 成年人黄色大片在线| 精品国产污网站| xxxxxx国产| 99天天综合性| 妺妺窝人体色www在线小说| 欧美日韩看看2015永久免费| 久久久亚洲精选| 亚洲欧美自偷自拍| 色综合久久综合网欧美综合网| 女人被狂躁c到高潮| 麻豆精品91| 少妇特黄a一区二区三区| 成人午夜在线| 久久精品久久久久久| 国产精品久久无码一三区| 亚洲视频免费在线观看| 午夜诱惑痒痒网| 国产精品www994| 精品国产乱码久久久久软件| 国产伦子伦对白在线播放观看| 亚洲国内精品在线| 天堂网视频在线| 国产精品美女久久久久久久久| 五月天亚洲视频| 国产精品久久久久久久免费观看| 国产一区私人高清影院| 色呦呦在线播放| 日韩欧美国产一区二区在线播放| 精品97人妻无码中文永久在线| 成人美女视频在线观看| 国产成人a亚洲精v品无码| 国产尤物久久久| 成人免费午夜电影| 超级白嫩亚洲国产第一| 国产一区二区三区丝袜| 91丨九色丨丰满| 亚洲国产wwwccc36天堂| 三上悠亚影音先锋| 国产一区二区三区四区五区入口| 精品一区二区三区无码视频| 色橹橹欧美在线观看视频高清| 国产精品18久久久久久麻辣| 国产精品va在线观看视色| 亚洲精品一区二区精华| 无码人妻丰满熟妇精品| 亚洲色图一区二区三区| 午夜一区二区三区免费| 久久99久久99| 亚洲欧洲日产国码无码久久99| 日韩欧美三级| 久99久在线| 婷婷久久免费视频| 欧美一级淫片videoshd| 成人免费看片| 亚洲人精选亚洲人成在线| 国产模特av私拍大尺度| 狠狠色噜噜狠狠狠狠97| 国精品人伦一区二区三区蜜桃| gogogo免费视频观看亚洲一| 亚洲这里只有精品| 国产精品美女久久久| 麻豆中文字幕在线观看| 久久av综合| 成人免费看片网站| 韩国精品视频在线观看 | 欧美日韩精品一区二区三区视频| 欧美富婆性猛交| 国产h视频在线观看| 欧美精品一区二区三| 一级特黄aaa大片| 色综合欧美在线视频区| 国产成人亚洲精品自产在线| 亚洲欧美激情一区二区| www色com| 久久影院午夜片一区| 中文字幕第九页| 国产精品77777| 五月六月丁香婷婷| 麻豆精品在线视频| 九色porny91| 午夜亚洲精品| 2022亚洲天堂| 99精品免费| 国产毛片久久久久久国产毛片| 亚洲精品a级片| 精品国产无码在线| 91视频久久| 亚洲国产日韩美| 欧美日韩在线播放视频| 欧美在线日韩精品| 中文字幕亚洲影视| 蜜桃视频在线观看91| 麻豆一区二区麻豆免费观看| av蓝导航精品导航| 在线日韩成人| 99三级在线| 视频二区欧美| 97影院在线午夜| 一区二区三区在线资源| 国产精品一区免费观看| 亚洲视频国产| 国产精品国产精品| 国产成人精品亚洲线观看| 国产传媒一区| 久久男人av| 精品在线视频一区二区| 网曝91综合精品门事件在线| 久久精品第九区免费观看| 亚洲人成网站77777在线观看| 欧美激情第六页| 成人综合久久| 懂色av粉嫩av蜜臀av| 欧美成人有码| 国产高清精品在线观看| 日韩主播视频在线| 久久久精品高清| 国产成人精品一区二| 91丨porny丨对白| 久久综合久久综合亚洲| 日韩视频在线观看免费视频| 国产精品久久久久久久午夜片| 日韩在线观看视频一区二区| 一区二区三区精品视频| 日韩成人免费观看| 色偷偷久久一区二区三区| 最新黄色网址在线观看| 欧美一区二区私人影院日本| 丰满肉肉bbwwbbww| 日韩国产中文字幕| 一区二区三区视频网站| 欧美国产精品人人做人人爱| 极品美鲍一区| 国产精品视频26uuu| 深夜福利一区二区三区| 久久久7777| 中文一区一区三区免费在线观看| 婷婷五月综合缴情在线视频| 强制捆绑调教一区二区| 免费黄视频在线观看| 久久欧美中文字幕| 永久久久久久久| 色婷婷av一区二区| 99在线小视频| 亚洲欧洲偷拍精品| 视频在线观看入口黄最新永久免费国产 | 国产三级在线播放| 欧美一级视频免费在线观看| 亚洲综合伊人| 久久婷婷人人澡人人喊人人爽| 日韩欧美三级| 欧美日韩第二页| 国产成人综合在线| 美国美女黄色片| 精品久久久久久| 国产女主播福利| 亚洲视频欧洲视频| 国产探花视频在线观看| 国产精品香蕉在线观看| 欧美五码在线| 国产专区在线视频| 麻豆免费精品视频| 欧美成人国产精品一区二区| 亚洲午夜在线视频| 97国产精品久久久| 亚洲最新视频在线| 午夜伦理福利在线| 成人动漫在线观看视频| 亚洲天堂网中文字| 国产情侣av自拍| 国产成人av电影在线| 日本美女bbw| 岛国av一区二区| 精品国产伦一区二区三| 日韩在线免费av| 精品3atv在线视频| 久久久99国产精品免费| 伊人天天综合| 成人三级做爰av| 国产精品久久久久久久第一福利| 久久久成人免费视频| 亚洲国产精久久久久久| 一区二区三区伦理| 91日本在线视频| 亚洲一级淫片| 亚洲综合20p| 国产精品初高中害羞小美女文| 免费又黄又爽又猛大片午夜| 亚洲精品久久久久久下一站| 国内在线视频| 成人av播放| 亚洲国产精品一区| 中文字幕第3页| 亚洲成人你懂的| 日韩一卡二卡在线| 久久免费国产精品1| 粉嫩av一区二区| 国产xxxx振车| k8久久久一区二区三区| 日韩 欧美 精品| 亚洲国产99精品国自产| 啦啦啦中文在线观看日本| 99久久精品久久久久久ai换脸| 中文字幕亚洲精品乱码| 日批视频在线看| 亚洲综合偷拍欧美一区色| 亚洲风情第一页| 久久久欧美精品| 丝袜av一区| 亚洲电影免费观看| 亚洲欧美日韩免费| 热久久99这里有精品| 国产亚洲一卡2卡3卡4卡新区 | 青青草视频一区| 日本二区三区视频| 欧美一二区视频| caoprom在线| 久久av一区二区| 久久中文在线| 三级黄色免费观看| 日韩一区二区不卡| 55av亚洲| 日韩欧美视频一区二区| 久久97超碰国产精品超碰| 九九热视频精品| 日韩精品中文字幕在线播放| 欧美7777| 黄色录像特级片| av一区二区不卡| 中文字字幕在线观看| 九九视频直播综合网| 丝袜美腿综合| 国产精欧美一区二区三区白种人| 亚洲伊人色欲综合网| 日本一卡二卡四卡精品| 91精品国产综合久久久久久久久| 激情综合自拍| 免费一级特黄3大片视频| 欧美一级免费大片| 在线观看欧美日韩电影| 亚洲免费av网| 久久亚洲精精品中文字幕早川悠里 | 免费看黄色片的网站| 色成年激情久久综合| 国产网友自拍视频导航网站在线观看| 狠狠久久综合婷婷不卡| 麻豆成人91精品二区三区| 国产精品成人aaaa在线| 色偷偷综合社区| 色爱av综合网|