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

av超碰免费在线| 黄视频网站免费看| 国产无遮挡裸体视频在线观看| 狠狠色综合日日| 在线视频欧美日韩| 男女曰b免费视频| 国产在线黄色| 久久精品国产久精国产| 九九视频直播综合网| 午夜视频在线观看国产| 在线手机中文字幕| 国产女主播在线一区二区| 国产精品专区h在线观看| 少妇高潮在线观看| xxxx日韩| 91成人看片片| 视频一区二区视频| 国内爆初菊对白视频| 香蕉久久国产| 最近2019中文字幕mv免费看 | 视频二区在线观看| 在线看片不卡| 亚洲美女视频网| 污污的视频免费观看| 黄页网站在线| 久久天天做天天爱综合色| 国产精品嫩草影院久久久| 五月天婷婷色综合| 天堂在线精品| 欧美一区二区视频网站| 春日野结衣av| 黄色网址视频在线观看| av亚洲精华国产精华| 国产成人高潮免费观看精品| √天堂中文官网8在线| 日韩aaa久久蜜桃av| 欧美疯狂性受xxxxx喷水图片| 欧美日韩一道本| 黄色视屏网站在线免费观看| 另类综合日韩欧美亚洲| 性金发美女69hd大尺寸| 久久精品国产亚洲AV成人婷婷| 99精品国产一区二区三区2021| 在线观看三级视频欧美| 国产中文字幕二区| 色综合久久影院| 91蜜桃视频在线| 51精品国产人成在线观看| 日本中文在线播放| 一区二区蜜桃| 色哟哟入口国产精品| 亚洲国产果冻传媒av在线观看| 国产精品日本一区二区不卡视频| 一道本成人在线| 国产男女免费视频| 国产一二区在线观看| 成人免费黄色在线| 成人日韩av在线| 久久久久在线视频| 国产一区白浆| 91av视频在线观看| 国产午夜精品一区二区理论影院| 99九九热只有国产精品| 国产亚洲激情视频在线| aaaaa一级片| 国产精品美女在线观看直播| 欧美一区二区三区性视频| www.精品在线| 亚洲成av在线| 色综合久久88色综合天天6| 日韩五码在线观看| heyzo在线| 偷拍亚洲欧洲综合| 免费在线观看视频a| 都市激情久久综合| 亚洲香蕉伊在人在线观| 一区高清视频| 精品国产白色丝袜高跟鞋| 中文字幕av一区二区三区| 日本一区二区三区视频在线观看 | h网站在线免费观看| 91婷婷韩国欧美一区二区| 国产精品一区二区av| 超碰在线观看av| 高清日韩电视剧大全免费| 国产精品.com| 色呦呦视频在线| 99精品视频一区二区三区| 韩国成人av| 天天爱天天干天天操| 99精品国产视频| 麻豆精品传媒视频| 国产高清在线观看| 国产精品灌醉下药二区| 国产系列第一页| 丝袜在线观看| 色综合久久综合中文综合网| www.日日操| 亚洲狼人在线| 亚洲精品wwww| 蜜乳av中文字幕| 亚洲国产精品久久久天堂| 九九精品视频在线观看| 日本在线免费观看| 日韩电影在线观看电影| 国产欧美一区二区白浆黑人| 一区二区三区www污污污网站| 久久精品国产久精国产爱| 97se视频在线观看| 色婷婷在线视频| 国产精品三级av| 国产美女作爱全过程免费视频| 国产直播在线| 欧美嫩在线观看| 人妻 丝袜美腿 中文字幕| 成人高潮视频| 中文字幕亚洲一区二区三区| 久久久综合久久| 久久精品一区二区国产| 91嫩草在线| 日本亚洲一区| 亚洲激情在线激情| 欧美国产日韩在线播放| 91精品国产自产精品男人的天堂| 日韩精品中文字幕在线| www深夜成人a√在线| 国产日本精品| 91在线观看免费观看| 日本电影一区二区在线观看| 最新日韩在线视频| 男女激情无遮挡| 亚洲成人人体| 亚洲国产毛片完整版| 欧美xxxooo| 国产精品一级| 亚洲一区二区三区乱码aⅴ| 色在线免费视频| 亚洲狠狠丁香婷婷综合久久久| 激情婷婷综合网| 高清精品视频| 欧美精品在线免费播放| 国产偷人爽久久久久久老妇app| 成人免费毛片嘿嘿连载视频| 国产成年人在线观看| 欧美magnet| 亚洲第一视频网站| www.xxxx日本| 人禽交欧美网站| 国模精品一区二区三区| 手机av免费在线| 欧美精品久久久久久久多人混战 | 伊人狠狠色丁香综合尤物| 三级中文字幕在线观看| 欧美mv日韩mv国产网站app| 2017亚洲天堂| 日本vs亚洲vs韩国一区三区二区| 精品日韩美女| 僵尸再翻生在线观看| 精品国产乱码久久久久久老虎 | 欧美成人一二区| 亚洲精品视频播放| 国产情侣在线视频| 成人美女视频在线观看| 欧美一级爱爱视频| 香蕉成人app| 欧美另类极品videosbest最新版本 | 你懂的亚洲视频| 国产精品天天狠天天看| 成年人在线视频| 欧美视频在线一区二区三区| 久久久久久国产免费a片| 日本中文字幕不卡| 日韩欧美视频一区二区三区四区| 欧美黑人巨大xxxxx| 亚洲人高潮女人毛茸茸| 成人午夜淫片100集| 91在线高清观看| 国产精品久久国产| 国产精品45p| 欧美一区二区三区免费观看| 天堂在线一二区| 一本一道久久a久久精品综合蜜臀| 欧美丰满少妇人妻精品| 国产一区二区你懂的| 欧美日韩在线精品| 久久久久久久性潮| 久久久av一区| 亚洲福利在线观看视频| 亚洲国产日韩a在线播放性色| 男人添女人荫蒂国产| 亚洲三级国产| 欧美日韩亚洲在线| 久久久久伊人| 久久久999精品| 亚洲国产www| 日韩欧美a级成人黄色| 伊人网综合视频| 久久av一区| 亚洲免费精品视频| 免费看日产一区二区三区| 高清一区二区三区四区五区| 黄色小视频在线观看| 欧美日本国产视频| 久久精品国产亚洲av无码娇色 | 一区二区三区免费在线观看视频| 丝袜美腿亚洲综合| 一区二区三区四区久久| 午夜久久av| 日韩av色在线| 黄色免费网站在线观看| 亚洲精品白浆高清久久久久久| 黄色片视频免费| 亚洲精品第一国产综合野| 在线观看日韩精品视频| 久久精品国内一区二区三区| 男人天堂av片| 成人vr资源| 亚洲a中文字幕| 成人免费直播| 色婷婷综合成人av| 神马久久久久| 欧美一级二级在线观看| 亚洲欧美综合自拍| 成人免费在线观看入口| 久久国产精品无码一级毛片| 开心九九激情九九欧美日韩精美视频电影 | 69国产精品视频免费观看| 亚洲视频狠狠干| 亚洲激情视频小说| 国产一区二区在线观看视频| 水蜜桃色314在线观看| 99久久综合| 欧洲精品久久| 青青视频一区二区| 成人中文字幕在线观看| 成人免费看视频网站| 欧美极品欧美精品欧美视频| 在线视频91p| 亚洲欧美色婷婷| 在线观看毛片网站| 色综合天天综合网天天狠天天 | 涩涩视频免费看| 7878成人国产在线观看| www.日韩一区| 天天色图综合网| 黄色一级片在线| 国产精品不卡视频| 波多野结衣影院| 久久国产福利国产秒拍| 亚洲综合在线网站| 久久aⅴ乱码一区二区三区| 高清无码视频直接看| 精品久久视频| 神马影院我不卡| 在线日韩网站| 国产欧美一区二区视频| gogo人体一区| 99视频日韩| 欧美区一区二区| 91九色国产在线| 男人天堂久久| 国产欧美日韩中文字幕在线| 日韩在线观看不卡| 97香蕉久久超级碰碰高清版| caoporn视频在线观看| 久久久久免费精品国产| 羞羞视频在线观看免费| 色综合导航网站| 欧美高清另类hdvideosexjaⅴ| 日韩中文字幕免费看| 麻豆传媒免费在线观看| 久久99久久99精品中文字幕 | 自拍偷拍亚洲激情| 99鲁鲁精品一区二区三区| 国产精品妹子av| 久草视频免费播放| 污片在线观看一区二区| 国语对白永久免费| 欧美日韩日本视频| 国产免费av电影| 亚洲精品在线观看网站| 天堂成人在线| 一区二区三欧美| 毛片激情在线观看| 日韩最新在线视频| 丰满的护士2在线观看高清| 91高潮精品免费porn| 成人勉费视频| 91精品国产91久久久久青草| 综合伊人久久| 麻豆久久久9性大片| 久久免费大视频| 免费看欧美一级片| 亚洲影院一区| 国产福利视频在线播放| 极品少妇xxxx精品少妇偷拍| 成人做爰69片免费| 91丨国产丨九色丨pron| 手机在线免费看毛片| 婷婷久久综合九色综合伊人色| 天天爱天天做天天爽| 欧美成人性战久久| 你懂的好爽在线观看| 日韩资源在线观看| 菠萝菠萝蜜在线视频免费观看| 欧美一区二区三区艳史| 欧美日韩国产网站| 99久久精品免费看国产一区二区三区| 欧美人与物videos另类xxxxx| 在线观看日韩片| 亚洲精品免费观看| 中文字幕1234区| 91免费国产在线观看| 国产成人自拍网站| 午夜av电影一区| 国产免费叼嘿网站免费| 亚洲美女av黄| 免费不卡av| 91九色综合久久| 亚洲人成网站77777在线观看| 一区二区三区欧美成人| 久久国产福利| 图片区偷拍区小说区| 国产精品久久免费看| 青娱乐国产盛宴| 欧美性猛交xxxx乱大交退制版| 性欧美一区二区三区| 日韩国产欧美精品一区二区三区| 日韩av毛片| 91精品国产综合久久香蕉| 日本国产精品| 人妻夜夜添夜夜无码av| 精品午夜一区二区三区在线观看| av黄色一级片| 亚洲v日本v欧美v久久精品| 国产日韩一级片| 这里只有精品丝袜| 免费观看成人性生生活片| 国产日韩三区| 中文字幕日韩一区二区不卡| 91亚洲精品久久久蜜桃借种| 久久精品人人做人人爽人人 | 亚洲综合久久久| 国产偷拍一区二区| 在线成人激情视频| 婷婷激情一区| 日韩欧美精品久久| 久久午夜激情| 90岁老太婆乱淫| 在线精品视频免费观看| 日批视频在线播放| 久久久久久亚洲| 欧美精品国产白浆久久久久| www.xxx麻豆| 国产白丝精品91爽爽久久| 久久网一区二区| 欧美一区二区三区日韩视频| 97在线观看免费观看高清| 国产日本欧美一区二区三区在线| 青青草91久久久久久久久| 91激情视频在线| 国产精品―色哟哟| 亚洲自拍偷拍另类| 久久天堂电影网| 一区三区自拍| 免费拍拍拍网站| 粉嫩aⅴ一区二区三区四区五区| 国产真实的和子乱拍在线观看| 日韩精品中文字幕一区二区三区 | 色综合色综合久久综合频道88| 成人在线视频www| 免费在线看黄色片| 成人性生交大片免费| 久久久无码一区二区三区| 亚洲精选中文字幕| 午夜日韩成人影院| 色中色综合成人| 国产99久久久国产精品潘金网站| 久草免费在线视频观看| 亚洲国产高清福利视频| 成人黄色免费短视频| 亚洲成人精品电影在线观看| 麻豆九一精品爱看视频在线观看免费| 人成免费在线视频| 欧美精品乱码久久久久久按摩| 秋霞成人影院| 久久99精品国产99久久| 久热国产精品| 亚洲一级黄色录像| 欧美精选午夜久久久乱码6080| 曰本三级在线| 日本不卡在线观看| 久久精品国产一区二区三区免费看| 91插插插插插插| 日韩精品中文字幕在线观看| 欧美少妇激情| 欧美黑人在线观看| 国产精品三级视频| 国产成人精品免费看视频| 久久久久国产精品免费网站|