成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[421810]]

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

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

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

思路分析

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

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

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

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

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

當然,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 代表不自動修復。

之后,調(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!

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

修復的話就是把 value 的部分替換掉,也就是拿到 value 的 range(開始和結(jié)束的下標),把該 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,再跑一下:

做了自動的修復,沒有報錯了!

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

總結(jié)

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

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

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

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

 

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

 

責任編輯:武曉燕 來源: 神光的編程秘籍
相關(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插件鼠標

2014-04-09 10:16:28

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

2011-09-08 10:46:12

Widget

2015-06-02 04:13:23

Python乒乓球類游戲

2024-07-10 10:38:58

Vue組件函數(shù)

2014-12-17 09:40:22

dockerLinuxPaaS

2020-03-22 11:20:16

Vue開發(fā)前端

2022-05-16 08:42:26

Pandasbug

2022-07-22 15:40:26

Atlassian服務器漏洞

2024-01-25 09:09:00

fsp幀數(shù)游戲

2012-01-04 13:55:23

Canvas

2022-02-20 22:16:44

ESLint工具JavaScript

2025-01-08 06:00:00

Argus開源安全檢查工具

2022-07-18 10:43:12

項目TienChinJava

2018-10-11 11:07:28

Windows虛擬機方法

2016-03-08 09:52:22

xcode插件開發(fā)
點贊
收藏

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

主站蜘蛛池模板: 久久久久久久99 | 成人av观看 | a毛片| 91久久久久久久久久久久久 | 国产精品毛片一区二区三区 | 欧美一区二区三区电影 | 亚洲一区二区三区观看 | 91国在线观看| 午夜影院在线免费观看视频 | 91精品久久久久久久久久 | 久久精品亚洲精品国产欧美 | 91在线导航| 九九热视频这里只有精品 | 岛国精品 | 日本天堂一区二区 | 国产精品久久久久久久久图文区 | 羞羞网站在线免费观看 | 欧美亚洲另类在线 | 亚洲在线免费观看 | 成人精品福利 | 色欧美综合 | 欧美 日韩 国产 成人 在线 91 | 免费欧美| 国产日韩欧美中文 | 成人小视频在线观看 | 午夜资源| 伊人焦久影院 | 欧美精品一区三区 | 欧美日韩综合视频 | 国产专区免费 | 一区二区三区高清不卡 | 中文字幕在线观看第一页 | 久久精品亚洲精品国产欧美 | 天堂中文av | 99久久精品免费看国产小宝寻花 | 国产一区二区影院 | 日本三级电影免费观看 | 免费在线观看av的网站 | 美国黄色毛片 | 人人草人人干 | 国产精品久久久久一区二区三区 |