定制團隊eslint
- 前言
- ESLint
- 介紹
- 作用
- 配置方式
- 配置引數[主要針對第二種方式]
- Rules 說明
- 結尾語
前言
我們都知道,javascript 是一門動態弱型別語言,現在平臺、環境等各種因素,很復雜,造成團隊之間的風格,各種各樣,有時候也會出現不可避免的錯誤,造成的排查力度大,團隊維護難,團隊合作差等等,然而ESLint的出現,幫我們團隊解決了代碼統一,風格統一等的問題,讓我們能在編譯中發現代碼錯誤的工具,在團隊協作中,避免低級 Bug,產出風格統一的代碼,從而提高團隊的凝集力,對外讓人感覺很正規的印象,
ESLint
介紹
ESLint是一個開源的專案,由Nicholas C. Zakas(《JavaScript高級程式設計》作者)于2013年六月創建,它的目標是為JavaScript提供一個完全可配置的實用lint工具,
作用
在官網上是這樣說的:“ESLint查找并修復JavaScript代碼中的問題”
- 發現問題
ESLint靜態分析您的代碼以快速發現問題,ESLint內置于大多數文本編輯器中,您可以將ESLint作為持續集成管道的一部分運行,
- 自動修復
ESLint發現的許多問題都可以自動修復,ESLint修復程式可識別語法,因此您不會遇到傳統的查找和替換演算法引入的錯誤,
- 定制
預處理代碼,使用自定義決議器,并撰寫與ESLint內置規則一起使用的自己的規則,您可以自定義ESLint,使其完全按照專案所需的方式作業,
配置方式
配置方式有兩種,一種在目標檔案中使用注釋語法嵌入配置資訊,這種方式只針對當前檔案生效,第二種是全域的,針對整個專案空間或者專案中起作用,所以一般的大廠或者正規的前端團隊,都會定制屬于自己公司或團隊的一些規則配置,
- 第一種方式,作用域當前檔案,eg:
// 忽略 no-undef 檢查
/* eslint-disable no-undef */
js code
// 忽略 no-new 檢查
/* eslint-disable no-new */
js code
// 設定檢查
/*eslint eqeqeq: off*/ /*eslint eqeqeq: 0*/
js code
- 第二種方式,作用全域,檔案格式,eg:
- JavaScript - use .eslintrc.js 檔案匯出一個包含配置資訊的物件,
- JSON - 使用 .eslintrc.json 定義配置資訊,JSON 檔案中支持 JavaScript 注釋,
- package.json - 在 package.json 檔案中增加一個 eslintConfig 欄位,在該欄位中定義配置資訊,
- .eslintrc
- 多個配置 優先級. eg: .eslintrc.js > .eslintrc.yaml > .eslintrc.yml .eslintrc.json > .eslintrc > package.json
配置引數[主要針對第二種方式]
我們在專案中,都會看到這樣或那樣的組態檔,比如.eslintrc.js,.eslintrc.yaml, .eslintrc.yml, .eslintrc.json, .eslintrc等,還有的寫入到package.json里等等,無論哪一種方式,都是針對專案的一些配置,為了使其統一,其實配置里面是什么樣的引數或者key呢?eg:
module.exports = {
env: {
node: true
},
globals: {
var1: "writable",
....
},
extends: [
...
],
rules: {
...
},
parserOptions: {
...
}
}
- env:你的腳本將要運行在什么環境中,可以是brower、node、es6、mocha等等各種環境,eg:
module.exports = {
env: {
node: true,
browser: true,
commonjs: true,
es6: true,
...
},
...
}
Tips:在第一種方式中可以這樣使用,eg:
/* eslint-env node, mocha */
js code
- globals: 未在當前檔案中定義的全域變數時,會命中
no-undef規則,通過globals配置指定的全域變數無視no-undef規則,eg:
module.exports = {
...
globals: {
var1: "writable",
var2: "readonly",
....
},
...
}
- extends: 擴展,也就是可以在以后的基礎規則上進行擴展,eg:
module.exports = {
...
extends: {
// npm 包
'plugin:vue/essential',
'@vue/standard',
// 組態檔的絕對路徑或相對路徑指定
"./node_modules/coding-standard/eslintDefaults.js",
"./cicada-eslint-config.js"
...
},
...
}
- 一個指定基礎配置來源的字串
- 一個指定基礎配置來源的字串的陣列
往往大多數情況在集成的基礎上并不滿足我們的專案使用要求,往往需要在進行一些額外的配置,比如rules 引數指定的規則可按如下幾種方式進行擴展,eg:
-
啟用基礎配置中沒有規則
-
繼承基礎配置中的規則,改變其錯誤級別,但不改變其附加選項
- 基礎配置: “cicada”: [“error”, “allow-null”]
- 擴展配置: “cicada”: “warn”
- 最終有效配置:“cicada”: [“warn”, “allow-null”]
-
共享配置包,一類匯出 ESLint 配置物件的 npm 包,比如 eslint-config-standard、eslint-config-airbnb 等,共享配置包需要安裝才能使用,配置時可省略報名中的 eslint-config- 前綴,
-
eslint:recommended: 啟用 ESLint 內置規則集 的一個子集,
-
覆寫基礎配置中的規則
- 基礎配置:“quotes”: [“error”, “single”, “avoid-escape”]
- 擴展配置:“quotes”: [“error”, “single”]
- 最終有效配置: “quotes”: [“error”, “single”]
還有更多組合和復雜的配置,這里不在一一說明啦!
- plugin: 插件. 第三方定制的規則集合,插件名中的 eslint-plugin- 前綴可以省略,eg:
module.exports = {
...
plugins: {
'@typescript-eslint',
...
},
...
}
- parserOptions: 語法分析器選項,默認使用的語法分析器支持如下幾個選項:ecmaVersion、sourceType、ecmaFeatures,eg:
module.exports = {
...
parserOptions: {
parser: '@typescript-eslint/parser',
ecmaVersion: 2019,
sourceType: 'module',
...
},
...
}
Rules 說明
| 欄位 | 值 | 說明 |
|---|---|---|
| no-alert | 0 | 禁止使用alert confirm prompt |
| no-array-constructor | 2 | 禁止使用陣列構造器 |
| no-bitwise | 0 | 禁止使用按位運算子 |
| no-caller | 1 | 禁止使用arguments.caller或arguments.callee |
| no-catch-shadow | 2 | 禁止catch子句引數與外部作用域變數同名 |
| no-class-assign | 2 | 禁止給類賦值 |
| no-cond-assign | 2 | 禁止在條件運算式中使用賦值陳述句 |
| no-console | 2 | 禁止使用console |
| no-const-assign | 2 | 禁止修改const宣告的變數 |
| no-constant-condition | 2 | 禁止在條件中使用常量運算式 if(true) if(1) |
| no-continue | 0 | 禁止使用continue |
| no-control-regex | 2 | 禁止在正則運算式中使用控制字符 |
| no-debugger | 2 | 禁止使用debugger |
| no-delete-var | 2 | 不能對var宣告的變數使用delete運算子 |
| no-div-regex | 1 | 不能使用看起來像除法的正則運算式/=foo/ |
| no-dupe-keys | 2 | 在創建物件字面量時不允許鍵重復 {a:1,a:1} |
| no-dupe-args | 2 | 函式引數不能重復 |
| no-duplicate-case | 2 | switch中的case標簽不能重復 |
| no-else-return | 2 | 如果if陳述句里面有return,后面不能跟else陳述句 |
| no-empty | 2 | 塊陳述句中的內容不能為空 |
| no-empty-character-class | 2 | 正則運算式中的[]內容不能為空 |
| no-empty-label | 2 | 禁止使用空label |
| no-eq-null | 2 | 禁止對null使用==或!=運算子 |
| no-eval | 1 | 禁止使用eval |
| no-ex-assign | 2 | 禁止給catch陳述句中的例外引數賦值 |
| no-extend-native | 2 | 禁止擴展native物件 |
| no-extra-bind | 2 | 禁止不必要的函式系結 |
| no-extra-boolean-cast | 2 | 禁止不必要的bool轉換 |
| no-extra-parens | 2 | 禁止非必要的括號 |
| no-extra-semi | 2 | 禁止多余的冒號 |
| no-fallthrough | 1 | 禁止switch穿透 |
| no-floating-decimal | 2 | 禁止省略浮點數中的0 .5 3. |
| no-func-assign | 2 | 禁止重復的函式宣告 |
| no-implicit-coercion | 1 | 禁止隱式轉換 |
| no-implied-eval | 2 | 禁止使用隱式eval |
| no-inline-comments | 0 | 禁止行內備注 |
| no-inner-declarations | [2, “functions”] | 禁止在塊陳述句中使用宣告(變數或函式) |
| no-invalid-regexp | 2 | 禁止無效的正則運算式 |
| no-invalid-this | 2 | 禁止無效的this,只能用在構造器,類,物件字面量 |
| no-irregular-whitespace | 2 | 不能有不規則的空格 |
| no-iterator | 2 | 禁止使用__iterator__ 屬性 |
| no-label-var | 2 | label名不能與var宣告的變數名相同 |
| no-labels | 2 | 禁止標簽宣告 |
| no-lone-blocks | 2 | 禁止不必要的嵌套塊 |
| no-lonely-if | 2 | 禁止else陳述句內只有if陳述句 |
| no-loop-func | 1 | 禁止在回圈中使用函式(如果沒有參考外部變數不形成閉包就可以) |
| no-mixed-requires | [0, false] | 宣告時不能混用宣告型別 |
| no-mixed-spaces-and-tabs | [2, false] | 禁止混用tab和空格 |
| linebreak-style | [0, “windows”] | 換行風格 |
| no-multi-spaces | 0 | 不能用多余的空格 |
| no-multi-str | 2 | 字串不能用\換行 |
| no-multiple-empty-lines | [1, {"max | 3}] |
| no-native-reassign | 2 | 不能重寫native物件 |
| no-negated-in-lhs | 2 | in 運算子的左邊不能有! |
| no-nested-ternary | 0 | 禁止使用嵌套的三目運算 |
| no-new | 1 | 禁止在使用new構造一個實體后不賦值 |
| no-new-func | 1 | 禁止使用new Function |
| no-new-object | 2 | 禁止使用new Object() |
| no-new-require | 2 | 禁止使用new require |
| no-new-wrappers | 2 | 禁止使用new創建包裝實體,new String new Boolean new Number |
| no-obj-calls | 2 | 不能呼叫內置的全域物件,比如Math() JSON() |
| no-octal | 2 | 禁止使用八進制數字 |
| no-octal-escape | 2 | 禁止使用八進制轉義序列 |
| no-param-reassign | 2 | 禁止給引數重新賦值 |
| no-path-concat | 0 | node中不能使用__dirname或__filename做路徑拼接 |
| no-plusplus | 0 | 禁止使用++,– |
| no-process-env | 0 | 禁止使用process.env |
| no-process-exit | 0 | 禁止使用process.exit() |
| no-proto | 2 | 禁止使用__proto__屬性 |
| no-redeclare | 2 | 禁止重復宣告變數 |
| no-regex-spaces | 2 | 禁止在正則運算式字面量中使用多個空格 /foo bar/ |
| no-restricted-modules | 0 | 如果禁用了指定模塊,使用就會報錯 |
| no-return-assign | 1 | return 陳述句中不能有賦值運算式 |
| no-script-url | 0 | 禁止使用javascript:void(0) |
| no-self-compare | 2 | 不能比較自身 |
| no-sequences | 0 | 禁止使用逗號運算子 |
| no-shadow | 2 | 外部作用域中的變數不能與它所包含的作用域中的變數或引數同名 |
| no-shadow-restricted-names | 2 | 嚴格模式中規定的限制識別符號不能作為宣告時的變數名使用 |
| no-spaced-func | 2 | 函式呼叫時 函式名與()之間不能有空格 |
| no-sparse-arrays | 2 | 禁止稀疏陣列, [1,2] |
| no-sync | 0 | nodejs 禁止同步方法 |
| no-ternary | 0 | 禁止使用三目運算子 |
| no-trailing-spaces | 1 | 一行結束后面不要有空格 |
| no-this-before-super | 0 | 在呼叫super()之前不能使用this或super |
| no-throw-literal | 2 | 禁止拋出字面量錯誤 throw “error”; |
| no-undef | 2 | 不能有未定義的變數 |
| no-undef-init | 2 | 變數初始化時不能直接給它賦值為undefined |
| no-undefined | 2 | 不能使用undefined |
| no-unexpected-multiline | 2 | 避免多行運算式 |
| no-underscore-dangle | 1 | 識別符號不能以_開頭或結尾 |
| no-unneeded-ternary | 2 | 禁止不必要的嵌套 var isYes = answer === 1 ? true : false; |
| no-unreachable | 2 | 不能有無法執行的代碼 |
| no-unused-expressions | 2 | 禁止無用的運算式 |
| no-unused-vars | [2, {“vars”: “all”, “args”: “after-used”}] | 不能有宣告后未被使用的變數或引數 |
| no-use-before-define | 2 | 未定義前不能使用 |
| no-useless-call | 2 | 禁止不必要的call和apply |
| no-void | 2 | 禁用void運算子 |
| no-var | 0 | 禁用var,用let和const代替 |
| no-warning-comments | [1, { “terms”: [“todo”, “fixme”, “xxx”], “location”: “start” }] | 不能有警告備注 |
| no-with | 2 | 禁用with |
| array-bracket-spacing | [2, “never”] | 是否允許非空陣列里面有多余的空格 |
| arrow-parens | 0 | 箭頭函式用小括號括起來 |
| arrow-spacing | 0 | =>的前/后括號 |
| accessor-pairs | 0 | 在物件中使用getter/setter |
| block-scoped-var | 0 | 塊陳述句中使用var |
| brace-style | [1, “1tbs”] | 大括號風格 |
| callback-return | 1 | 避免多次呼叫回呼什么的 |
| camelcase | 2 | 強制駝峰法命名 |
| comma-dangle | [2, “never”] | 物件字面量項尾不能有逗號 |
| comma-spacing | 0 | 逗號前后的空格 |
| comma-style | [2, “last”] | 逗號風格,換行時在行首還是行尾 |
| complexity | [0, 11] | 回圈復雜度 |
| computed-property-spacing | [0, “never”] | 是否允許計算后的鍵名什么的 |
| consistent-return | 0 | return 后面是否允許省略 |
| consistent-this | [2, “that”] | this別名 |
| constructor-super | 0 | 非派生類不能呼叫super,派生類必須呼叫super |
| curly | [2, “all”] | 必須使用 if(){} 中的{} |
| default-case | 2 | switch陳述句最后必須有default |
| dot-location | 0 | 物件訪問符的位置,換行的時候在行首還是行尾 |
| dot-notation | [0, { “allowKeywords”: true }] | 避免不必要的方括號 |
| eol-last | 0 | 檔案以單一的換行符結束 |
| eqeqeq | 0 | 必須使用全等 |
| func-names | 0 | 函式運算式必須有名字 |
| func-style | [0, “declaration”] | 函式風格,規定只能使用函式宣告/函式運算式 |
| generator-star-spacing | 0 | 生成器函式*的前后空格 |
| guard-for-in | 0 | for in回圈要用if陳述句過濾 |
| handle-callback-err | 0 | nodejs 處理錯誤 |
| id-length | 0 | 變數名長度 |
| indent | [2, 2] | 縮進風格 |
| init-declarations | 0 | 宣告時必須賦初值 |
| key-spacing | [0, { “beforeColon”: false, “afterColon”: true }] | 物件字面量中冒號的前后空格 |
| lines-around-comment | 0 | 行前/行后備注 |
| max-depth | [0, 4] | 嵌套塊深度 |
| max-len | [0, 80, 4] | 字串最大長度 |
| max-nested-callbacks | [0, 2] | 回呼嵌套深度 |
| max-params | [0, 3] | 函式最多只能有3個引數 |
| max-statements | [0, 10] | 函式內最多有幾個宣告 |
| new-cap | 2 | 函式名首行大寫必須使用new方式呼叫,首行小寫必須用不帶new方式呼叫 |
| new-parens | 2 | new時必須加小括號 |
| newline-after-var | 2 | 變數宣告后是否需要空一行 |
| object-curly-spacing | [0, “never”] | 大括號內是否允許不必要的空格 |
| object-shorthand | 0 | 強制物件字面量縮寫語法 |
| one-var | 1 | 連續宣告 |
| operator-assignment | [0, “always”] | 賦值運算子 += -=什么的 |
| operator-linebreak | [2, “after”] | 換行時運算子在行尾還是行首 |
| padded-blocks | 0 | 塊陳述句內行首行尾是否要空行 |
| prefer-const | 0 | 首選const |
| prefer-spread | 0 | 首選展開運算 |
| prefer-reflect | 0 | 首選Reflect的方法 |
| quotes | [1, “single”] | 引號型別 `` “” ‘’ |
| quote-props | [2, “always”] | 物件字面量中的屬性名是否強制雙引號 |
| radix | 2 | parseInt必須指定第二個引數 |
| id-match | 0 | 命名檢測 |
| require-yield | 0 | 生成器函式必須有yield |
| semi | [2, “always”] | 陳述句強制分號結尾 |
| semi-spacing | [0, {“before”: false, “after”: true}] | 分號前后空格 |
| sort-vars | 0 | 變數宣告時排序 |
| space-after-keywords | [0, “always”] | 關鍵字后面是否要空一格 |
| space-before-blocks | [0, “always”] | 不以新行開始的塊{前面要不要有空格 |
| space-before-function-paren | [0, “always”] | 函式定義時括號前面要不要有空格 |
| space-in-parens | [0, “never”] | 小括號里面要不要有空格 |
| space-infix-ops | 0 | 中綴運算子周圍要不要有空格 |
| space-return-throw-case | 2 | return throw case后面要不要加空格 |
| space-unary-ops | [0, { “words”: true, “nonwords”: false }] | 一元運算子的前/后要不要加空格 |
| spaced-comment | 0 | 注釋風格要不要有空格什么的 |
| strict | 2 | 使用嚴格模式 |
| use-isnan | 2 | 禁止比較時使用NaN,只能用isNaN() |
| valid-jsdoc | 0 | jsdoc規則 |
| valid-typeof | 2 | 必須使用合法的typeof的值 |
| vars-on-top | 2 | var必須放在作用域頂部 |
| wrap-iife | [2, “inside”] | 立即執行函式運算式的小括號風格 |
| wrap-regex | 0 | 正則運算式字面量用小括號包起來 |
| yoda | [2, “never”] | 禁止尤達條件 |
Tips
| error level | 數值表示 | 說明 |
|---|---|---|
| off | 0 | 關閉規則 |
| warn | 1 | 開啟規則, 使用警告 程式不會退出 |
| error | 2 | 開啟規則, 使用錯誤 程式退出 |
更多的規則可以參考官網的rules,
結尾語
寫到這里,eslint的一些東西了解的也差不多啦,在前端的領域中,其實挺復雜的,所以我不建議大家去記,只要大家會配置就行啦,再說那么api 怎么也記不過來,高端的程師,借用各種api 檔案,寫出自己的一些配置,這篇文章只是在定制前端規則的介紹,一些基礎的部分,去了解,讓大家有個好的印象,下文張,偏向代碼,直接定制我的cicada(禪思)的eslint 的配置,
定制團隊的eslint rules(二):更新中…
CSDN認證博客專家
Node.js
前端框架
小程式
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/241359.html
標籤:其他
