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

寫一個 Eslint 插件:Vue Template 中 Class 順序的檢查和自動修復(fù)

開發(fā) 前端
有小伙伴問我如何修復(fù) vue template 中的 class 名的順序、屬性名順序,還有 options 中的屬性順序的問題,用 eslint 可以做到么。

[[421810]]

有小伙伴問我如何修復(fù) vue template 中的 class 名的順序、屬性名順序,還有 options 中的屬性順序的問題,用 eslint 可以做到么。

答案是能,但是需要寫 eslint 插件來檢查和修復(fù)。

考慮到他可能沒有寫過 eslint 插件,所以我先把相對簡單的校驗和修復(fù) class 名的順序的插件摘出來實現(xiàn)了一下。

思路分析

首先,eslint 是否能 parse vue 的模版呢?

是可以的,因為 eslint 的 parser 支持切換,而 vue 實現(xiàn)了對應(yīng)的 parser,所以可以在 eslint 中使用 vue-eslint-parser 來解析模版。

我們可以使用 astexplorer.net 來看一下 parse 生成的 AST。

我們要處理的是 class 屬性,也就是 VAttribute 的 value 部分

可以支持傳入比較器來自定義順序,排序完之后設(shè)置回去。

當(dāng)然,vue 的模版支持 {} 來引用 data,這種我們不處理,可以過濾掉。

思路比較簡單,下面我們寫代碼來實現(xiàn)一下。

代碼實現(xiàn)

我們可以給插件起名為 vue-class-order。

首先,我們引入 eslint,設(shè)置 useEslintrc 為 false 也就是不使用配置文件,然后在 overrideConfig 屬性設(shè)置各種配置,rules 里填入這個插件。

  1. const { ESLint } = require("eslint"); 
  2.  
  3. const engine = new ESLint({ 
  4.     fix: false
  5.     overrideConfig: { 
  6.         parser: 'vue-eslint-parser'
  7.         parserOptions: { 
  8.             sourceType: 'module' 
  9.         }, 
  10.         rules: { 
  11.             "vue-class-order": [ "error" ] 
  12.         } 
  13.     }, 
  14.     rulePaths: ['./'], 
  15.     useEslintrc: false 
  16. }); 

這里的 parser 要使用 vue-eslint-parser 才可以,并且 rulePaths 也就是查找 rule 的路徑也要設(shè)置下。fix 設(shè)置為 false 代表不自動修復(fù)。

之后,調(diào)用它的 lintText 方法來對代碼進行 lint。

  1. (async function main() { 
  2.   const results = await engine.lintText(` 
  3. <template> 
  4. <div> 
  5.   <p class="c d e" >dongdong</p> 
  6.   <p class="c a b">guangguang</p> 
  7. </div> 
  8. </template> 
  9.  
  10. <script> 
  11. export default { 
  12. }; 
  13. </script> 
  14. `); 
  15.  
  16.   console.log(results[0].output); 
  17.  
  18.   const formatter = await engine.loadFormatter("stylish"); 
  19.   const resultText = formatter.format(results); 
  20.   console.log(resultText); 
  21. })(); 

之后在插件里面取出來:

  1. module.exports = { 
  2.      meta: { 
  3.          fixable: true 
  4.      }, 
  5.      create(context) { 
  6.          const comparator = context.options[0]; 
  7.           
  8.      } 
  9.  }; 
  10.   

這里的 comparator 就是從 context 中取出的參數(shù)。

插件的結(jié)構(gòu)是 meta,create 兩部分,meta 是各種描述插件本身的元信息,create 部分是插件的主要邏輯。

create 部分返回一個 visitor,聲明對什么節(jié)點進行什么操作。但是因為我們用的 parser 是 vue 自定義的(vue-eslint-parser),所以這里 visitor 也要用它提供的,也就是:

  1. module.exports = { 
  2.      meta: { 
  3.          fixable: true 
  4.      }, 
  5.      create(context) { 
  6.          const comparator = context.options[0]; 
  7.          return context.parserServices.defineTemplateBodyVisitor({ 
  8.             "VAttribute[key.name=class]"(node) {   
  9.                  
  10.             } 
  11.          }); 
  12.      } 
  13.  }; 

在 context.parserServices.defineTemplateBodyVisitor 方法中傳入具體的 visitor,比如我們需要對 VAttribute 節(jié)點做處理。

eslint 支持esqury 的寫法,也就是可以通過選擇器的方式來指定要處理的節(jié)點,這里我們指定 key.name 為 class 的 VAttribute 節(jié)點

之后要拿到節(jié)點的值,排序一下,看看是否是對的,不對就報錯。

  1. "VAttribute[key.name=class]"(node) {   
  2.     const classStr = node.value.value; 
  3.     if (!classStr.includes('{')) { //過濾掉有插值表達式的 class 
  4.         const curOrder = classStr.split(/\s/); 
  5.         const shouldOrder = [...curOrder].sort(comparator); 
  6.         if (curOrder.some((item, index) => curOrder[index] !== shouldOrder[index])) { 
  7.             context.report({ 
  8.                 node, 
  9.                 message: 'className 順序不對:' + classStr, 
  10.                 loc: node.value.loc 
  11.             }); 
  12.         } 
  13.     } 

這樣,我們就實現(xiàn)了對 vue 模版中 class 的順序的 lint。

我們試一下效果:

我們實現(xiàn)了對 className 順序的 lint!

當(dāng)然,只報錯不修復(fù)比較耍流氓,我們還得實現(xiàn)下自動修復(fù)。

修復(fù)的話就是把 value 的部分替換掉,也就是拿到 value 的 range(開始和結(jié)束的下標(biāo)),把該 range 的文本使用 fixer 的 api 替換掉。(這里要考慮引號)

  1. context.report({ 
  2.     node, 
  3.     message: 'className 順序不對:' + classStr, 
  4.     loc: node.value.loc, 
  5.     *fix(fixer) { 
  6.         const [ start, end ] = node.value.range; 
  7.         yield fixer.replaceTextRange([start + 1, end - 1], shouldOrder.join(' ')) 
  8.     } 
  9. }); 

我們把 fixer 設(shè)置為 true,再跑一下:

做了自動的修復(fù),沒有報錯了!

我們實現(xiàn)了對 vue 模版中 class 的順序的檢查和自動修復(fù)!

總結(jié)

Eslint 可以基于 AST 做代碼格式的檢查和修復(fù)。

基于 AST 那就得有對應(yīng)的 parser, eslint 支持 parser 的擴展,所以有很多 eslint parser 可用,要 parse vue 模版就可以用 vue-eslint-parser。可以用 astexplorer.net可視化的查看。

我們要實現(xiàn)對 vue 模版中 class 的順序的檢查,分析之后就是要取出 key 為 class 的 VAttribute 節(jié)點的 value,然后根據(jù)傳入的比較器進行排序,如果順序不一致,就報錯。并且還可以通過 fixer 的 api 進行自動修復(fù),也就是對該段 range 的文本進行替換。

這里我們通過 api 來調(diào)用的 eslint,通過 cli 也一樣。

 

這篇文章實現(xiàn)了一個相對簡單的 eslint 插件,對 vue template 中的代碼格式做了檢查和修復(fù),希望能夠幫助大家理清 eslint 插件開發(fā)的思路。

 

責(zé)任編輯:武曉燕 來源: 神光的編程秘籍
相關(guān)推薦

2022-01-18 18:46:55

Eslint抽象語法樹Babel

2021-09-02 13:38:48

Eslint Babel 插件

2021-09-02 16:15:29

開發(fā)技能代碼

2023-12-13 08:24:42

maven插件自動化

2020-12-09 07:54:17

Vue插件鼠標(biāo)

2011-09-08 10:46:12

Widget

2014-04-09 10:16:28

Linux文件系統(tǒng)fsck工具

2015-06-02 04:13:23

Python乒乓球類游戲

2024-07-10 10:38:58

Vue組件函數(shù)

2020-03-22 11:20:16

Vue開發(fā)前端

2014-12-17 09:40:22

dockerLinuxPaaS

2022-05-16 08:42:26

Pandasbug

2022-07-22 15:40:26

Atlassian服務(wù)器漏洞

2024-01-25 09:09:00

fsp幀數(shù)游戲

2012-01-04 13:55:23

Canvas

2025-01-08 06:00:00

Argus開源安全檢查工具

2022-02-20 22:16:44

ESLint工具JavaScript

2022-07-18 10:43:12

項目TienChinJava

2016-03-08 09:52:22

xcode插件開發(fā)

2018-10-11 11:07:28

Windows虛擬機方法
點贊
收藏

51CTO技術(shù)棧公眾號

天海翼一区二区| 国产永久免费网站| 外国精品视频在线观看 | 日韩电影视频免费| 成年人视频在线免费| 午夜免费视频在线国产| 久久97超碰国产精品超碰| 欧美国产日韩一区| 人妻熟女aⅴ一区二区三区汇编| av成人免费| 亚洲国产综合视频在线观看| 欧美日韩免费观看一区| 国产乱淫片视频| 国产美女诱惑一区二区| 日韩视频一区在线| 好吊日免费视频| 精品国产18久久久久久二百| 色中色一区二区| 在线看无码的免费网站| 午夜18视频在线观看| 老司机午夜精品99久久| 97高清免费视频| 三级影片在线观看| 亚洲人成网77777色在线播放| 宅男噜噜噜66一区二区66| 无码精品a∨在线观看中文| 精产国品自在线www| av电影一区二区| 91欧美精品午夜性色福利在线| 日韩免费黄色片| 91国语精品自产拍| 中文字幕在线亚洲| 中文字幕日韩三级片| 亚洲啊v在线免费视频| 欧美三级一区二区| 欧美牲交a欧美牲交aⅴ免费下载| 天堂va在线| 国产精品久久久久永久免费观看| 久久国产精品亚洲va麻豆| a级片在线免费看| 美女视频免费一区| 国产成人短视频| 日本在线播放视频| 亚洲国产高清一区二区三区| 久久中文字幕国产| 美女网站视频色| 国产毛片一区二区三区 | 国产第一区电影| 日本学生初尝黑人巨免费视频| 一区二区电影| 久久大大胆人体| 久久精品一区二区三区四区五区| 久久影视一区| 日韩有码在线观看| 久久精品色妇熟妇丰满人妻| 九一成人免费视频| 日韩精品免费视频| 老鸭窝一区二区| 欧美人与拘性视交免费看| 亚洲精品一区中文| 蜜桃av免费看| 精品72久久久久中文字幕| 亚洲欧美日韩天堂| 91网站免费视频| 精品美女久久久| 自拍偷拍亚洲区| 日韩不卡av在线| 国产精品x453.com| 美女视频久久黄| 久久免费公开视频| 一本色道久久| 日本在线观看天堂男亚洲 | 动漫一区二区在线| www.欧美国产| 成人av免费网站| 精品一区日韩成人| 国内三级在线观看| 国产精品免费av| 国产麻豆电影在线观看| 91麻豆免费在线视频| 亚洲大片精品永久免费| 每日在线更新av| 欧美aaa视频| 欧美浪妇xxxx高跟鞋交| 精产国品一区二区三区| 精品精品国产毛片在线看 | 亚洲欧美视频一区二区| 亚洲欧美精品午睡沙发| 国产日韩欧美精品在线观看| 欧美电影免费观看| 在线电影一区二区三区| 亚洲麻豆一区二区三区| 精品视频免费| 欧美猛少妇色xxxxx| 亚州国产精品视频| 久久99精品久久久久婷婷| 不卡一区二区三区四区五区| 三区在线视频| 最新国产成人在线观看| 欧美日韩不卡在线视频| 成人做爰视频www| 精品久久久网站| 国产精品国产三级国产专业不| 亚洲精品a级片| 欧美在线视频观看免费网站| 国产乱人乱偷精品视频a人人澡| 99精品在线免费| 中文字幕中文字幕一区三区| 九色porny丨国产首页在线| 欧美色网一区二区| 国产免费一区二区三区最新6| 日韩理论电影大全| 91精品国产高清自在线| 国产剧情精品在线| 久久午夜国产精品| 日韩精品视频在线观看视频| 成人在线免费av| 亚洲国产精品电影在线观看| 三级影片在线观看| 久久视频一区| 狠狠色噜噜狠狠色综合久| 日本中文在线观看| 日韩欧美有码在线| 中文字幕一区二区三区乱码不卡| 91视频一区| 国产成人精品视| 日本毛片在线观看| 一级做a爱片久久| 手机在线国产视频| 国产影视一区| 日韩av电影在线网| 少妇高潮一区二区三区69| 一区二区三区日韩精品视频| 中文字幕永久有效| 欧美精品一区二区三区中文字幕| 2019中文在线观看| 欧美视频久久久| 亚洲一区av在线| 国产精品二区视频| 在线成人直播| 91视频-88av| 日本在线人成| 欧美日韩三级在线| 亚洲精品视频网址| 日本人妖一区二区| 欧美午夜欧美| 播放一区二区| 国产一区二区欧美日韩| 337p粉嫩色噜噜噜大肥臀| 91麻豆蜜桃一区二区三区| 丁香花在线影院观看在线播放| 无人区乱码一区二区三区| 久久久国产视频91| 99国产精品一区二区三区| 亚洲欧美另类综合偷拍| 国产免费中文字幕| 亚洲经典一区| 豆国产97在线| 免费h视频在线观看| 日韩黄色av网站| 天天干天天色综合| 国产欧美一区二区在线| 在线免费观看av的网站| 999视频精品| 成人免费淫片aa视频免费| h网站久久久| 欧美成人免费网站| 国产精品1000| 久久一夜天堂av一区二区三区| 成人羞羞国产免费网站| 欧美美女一区| 91精品视频在线| 国产精品69xx| 亚洲经典中文字幕| 日本免费精品视频| 18涩涩午夜精品.www| 人妻体体内射精一区二区| 亚洲国产午夜| 欧美午夜精品理论片a级大开眼界 欧美午夜精品久久久久免费视 | 日本h片久久| 久久精品国产电影| 国产毛片一区二区三区va在线| 一区二区欧美视频| 30一40一50老女人毛片| 免费一级欧美片在线观看| 中文字幕制服丝袜在线| 日本精品一区二区三区在线观看视频| 久久久亚洲精品视频| 日本成人一区| 欧美精选午夜久久久乱码6080| 久久久久久久久久综合| 久久亚洲欧美国产精品乐播| 日本中文字幕精品—区二区| 亚洲综合专区| 蜜桃传媒视频麻豆一区| 天堂综合在线播放| 6080yy精品一区二区三区| 国产经典自拍视频在线观看| 91精品久久久久久久久99蜜臂| 日韩欧美亚洲视频| 中文字幕一区三区| 好吊色视频一区二区三区| 六月丁香婷婷久久| 免费无码不卡视频在线观看| 欧美韩日高清| 精品久久中出| 国产亚洲人成a在线v网站 | 在线观看免费成人| 久久亚洲精品大全| 国产精品美女一区二区三区| www.超碰97| 国产福利91精品一区二区三区| 北条麻妃在线一区| 激情综合亚洲| 一本二本三本亚洲码| 玖玖玖免费嫩草在线影院一区| 国产一区二区丝袜高跟鞋图片| 极品视频在线| 欧美高清在线观看| 番号在线播放| 亚洲第一偷拍网| 99国产在线播放| 欧美日韩在线播放一区| 国产精品视频久久久久久久| 一区二区三区欧美| 欧美高清视频一区二区| 亚洲成人av免费观看| 美女日韩在线中文字幕| 日韩 欧美 视频| 亚洲最新av| 中文字幕一区二区三区乱码| 欧美伦理在线视频| 欧美最大成人综合网| 日本午夜精品| 国产一区二区三区四区五区在线 | 欧美精品福利| 亚洲一区二区三区精品视频| 免费毛片在线不卡| 好吊色欧美一区二区三区视频| 天堂av一区| 亚洲一区二区三区视频播放| 巨大黑人极品videos精品| 国产91免费看片| 亚洲精品mv| 97成人超碰免| 黄在线观看免费网站ktv| 午夜精品久久久久久99热软件| 欧美寡妇性猛交xxx免费| 久久艳片www.17c.com| 黄色网址在线免费| 久久人体大胆视频| 九义人在线观看完整免费版电视剧| 中文字幕亚洲无线码在线一区| 国产福利片在线| 亚洲性无码av在线| 岛国在线大片| 色av中文字幕一区| 欧美69xxx| 欧美成人高清视频| 日本资源在线| 久久久亚洲国产| 筱崎爱全乳无删减在线观看 | 精品99久久久久久| 欧美视频一二区| 亚洲毛片在线观看| 国产精品毛片一区二区三区四区| 亚洲最新在线视频| 日本一区二区在线| 国产成人一区| 婷婷久久青草热一区二区 | 中文字幕日韩一区二区三区不卡| 久久理论电影| 米仓穗香在线观看| 亚洲黄色影片| 动漫av免费观看| 激情综合色播激情啊| 中文字幕一二三区| 91网址在线看| 欧美一区二区三区粗大| 亚洲美女一区二区三区| 在线看成人av| 色婷婷综合久色| 国产免费一区二区三区免费视频| 日韩午夜激情免费电影| 午夜成人免费影院| 色噜噜狠狠色综合网图区| 亚洲精品白浆| 日产精品99久久久久久| 亚洲欧美专区| 狠狠色狠狠色综合人人| 日本大胆欧美| 免费拍拍拍网站| 久久综合网络一区二区| 成人性生交视频免费观看| 粉嫩嫩av羞羞动漫久久久| 一区二区精品免费| 亚洲激情第一区| 免费在线观看黄网站| 欧美日韩另类一区| 四虎精品成人免费网站| 久久精品国产免费观看| 亚洲欧洲美洲av| 亚洲一区二区日本| 深爱激情久久| 国产女教师bbwbbwbbw| 丝袜美腿亚洲一区二区图片| 又黄又爽又色的视频| 久久久久久久久久久久久久久99 | 久久中文字幕二区| 欧美激情 国产精品| 亚洲欧美大片| 尤物一区二区三区| 一本久道久久久| 成人亚洲免费视频| 久久香蕉国产线看观看99| 加勒比av在线播放| 欧美性猛交xxxxxx富婆| 亚洲精品久久久久久无码色欲四季 | 尤物yw午夜国产精品视频| 激情av在线| 成人激情综合网| 国产亚洲精品美女久久久久久久久久| 久久久久久久久久久综合| 蜜臀av一区二区在线免费观看| 亚洲 欧美 日韩在线| 伊人开心综合网| 一本一道人人妻人人妻αv| 精品无码久久久久久国产| 日本孕妇大胆孕交无码| 91亚洲精品一区| 四季av一区二区凹凸精品| 国产成人av影视| 久久亚洲欧美国产精品乐播 | 91久久奴性调教| 日本毛片在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 色8久久影院午夜场| 久久久com| 亚洲一区二区动漫| 好男人香蕉影院| 亚洲高清不卡在线| 亚洲成人中文字幕在线| 欧美乱大交xxxxx另类电影| 二区三区精品| 97超碰免费观看| 国产一区999| 最新一区二区三区| 欧美一区二区三区思思人| caopeng在线| 亚洲va欧美va国产综合久久| 欧美国产小视频| 亚洲精品在线网址| 伊人婷婷欧美激情| 亚洲第一视频在线| 久久久人成影片一区二区三区| silk一区二区三区精品视频 | 欧美一卡2卡三卡4卡5免费| 超碰公开在线| 99久热re在线精品996热视频| 欧美日韩亚洲一区三区| 人妻激情偷乱频一区二区三区| 亚洲永久精品国产| 视频污在线观看| 欧洲亚洲女同hd| 欧美另类69xxxxx| 亚洲黄色av片| 亚洲二区在线视频| 天堂av网在线| 日本韩国欧美精品大片卡二| 激情综合网站| 国产精品久久久久久9999| 亚洲激情在线激情| 无码精品黑人一区二区三区| 欧美专区中文字幕| 成人影视亚洲图片在线| 伊人国产精品视频| 亚洲国产视频一区| 日本aaa在线观看| 国产日韩欧美日韩| 欧美啪啪一区| 免费在线观看你懂的| 欧美三级乱人伦电影| 在线中文免费视频| 久久伊人资源站| 美女在线一区二区| 久久亚洲AV无码| 亚洲午夜女主播在线直播| av日韩在线免费观看| 国产精品www在线观看| 国产婷婷一区二区| 精品毛片在线观看| 日本精品免费一区二区三区| 日韩在线综合| av av在线| 欧美色手机在线观看| 国模雨婷捆绑高清在线| 日本一区免费在线观看| 国产成人在线看| 国产免费一级视频| 色综合久久久888|