eslint:javascript代碼質量檢查工具。
目前大環境下主要有三款JS代碼質量檢查工具:jslint、jshint、eslint。
jslint:無需配置,直接使用,由於配置是定好的。缺點是有限的配置選項,不少規則不能禁用,規範嚴格,擴展性差,沒法根據錯誤定位到對應的規則。
jshint:是基於jslint開發的,有了不少參數能夠配置,支持配置文件,方便使用,支持了一些經常使用類庫,支持了基本的ES6,但缺點卻繼承了jshint的一部分:不支持自定義規則、沒法根據錯誤定位到對應的規則。
ESLint:默認規則裏面包含了JSLint和JSHint的規則,易於遷移,這一點分明就是在搶jslint、jshint的用戶;可配置爲警告和錯誤兩個等級,或者直接禁用掉,支持插件擴展,能夠自定義規則,能夠根據錯誤定位到對應的規則,支持ES6,惟一一個支持JSX的工具,缺點是須要進行一些自定義配置,執行速度上不如jslint和jshint。
下面是我平時使用的eslint的配置:javascript
{
"extends": "eslint:recommended", // 環境定義了預約義的全局變量。 "env": { //環境定義了預約義的全局變量。更多在官網查看 "browser":true, "node":true, "commonjs":true, "amd":true, "es6":true, "mocha":true }, "parser": "babel-eslint", // JavaScript 語言選項 "parserOptions": { // ECMAScript 版本 "ecmaVersion":6, "sourceType":"module",//module // 想使用的額外的語言特性: "ecmaFeatures": { // 容許在全局做用域下使用 return 語句 "globalReturn":true, // impliedStric "impliedStrict":true, // 啓用 JSX "jsx":true } }, "plugins": [ "react", "import" ], /** * "off" 或 0 - 關閉規則 * "warn" 或 1 - 開啓規則,使用警告級別的錯誤:warn (不會致使程序退出), * "error" 或 2 - 開啓規則,使用錯誤級別的錯誤:error (當被觸發的時候,程序會退出) */ "rules": { //////////////// // 可能的錯誤 // //////////////// // 禁止條件表達式中出現賦值操做符 "no-cond-assign":2, // 禁用 console "no-console":0, // 禁止在條件中使用常量表達式 // if (false) { // doSomethingUnfinished(); // } //cuowu "no-constant-condition":2, // 禁止在正則表達式中使用控制字符 :new RegExp("\x1f") "no-control-regex":2, // 數組和對象鍵值對最後一個逗號, never參數:不能帶末尾的逗號, always參數:必須帶末尾的逗號, // always-multiline:多行模式必須帶逗號,單行模式不能帶逗號 "comma-dangle": [1,"always-multiline"], // 禁用 debugger "no-debugger":2, // 禁止 function 定義中出現重名參數 "no-dupe-args":2, // 禁止對象字面量中出現重複的 key "no-dupe-keys":2, // 禁止重複的 case 標籤 "no-duplicate-case":2, // 禁止空語句塊 "no-empty":2, // 禁止在正則表達式中使用空字符集 (/^abc[]/) "no-empty-character-class":2, // 禁止對 catch 子句的參數從新賦值 "no-ex-assign":2, // 禁止沒必要要的布爾轉換 "no-extra-boolean-cast":2, // 禁止沒必要要的括號 //(a * b) + c;//報錯 "no-extra-parens":0, // 禁止沒必要要的分號 "no-extra-semi":2, // 禁止對 function 聲明從新賦值 "no-func-assign":2, // 禁止在嵌套的塊中出現 function 或 var 聲明 "no-inner-declarations": [2,"functions"], // 禁止 RegExp 構造函數中無效的正則表達式字符串 "no-invalid-regexp":2, // 禁止在字符串和註釋以外不規則的空白 "no-irregular-whitespace":2, // 禁止在 in 表達式中出現否認的左操做數 "no-negated-in-lhs":2, // 禁止把全局對象 (Math 和 JSON) 做爲函數調用 錯誤:var math = Math(); "no-obj-calls":2, // 禁止直接使用 Object.prototypes 的內置屬性 "no-prototype-builtins":0, // 禁止正則表達式字面量中出現多個空格 "no-regex-spaces":2, // 禁用稀疏數組 "no-sparse-arrays":2, // 禁止出現使人困惑的多行表達式 "no-unexpected-multiline":2, // 禁止在return、throw、continue 和 break語句以後出現不可達代碼 /* function foo() { return true; console.log("done"); }//錯誤 */ "no-unreachable":2, // 要求使用 isNaN() 檢查 NaN "use-isnan":2, // 強制使用有效的 JSDoc 註釋 "valid-jsdoc":1, // 強制 typeof 表達式與有效的字符串進行比較 // typeof foo === "undefimed" 錯誤 "valid-typeof":2, ////////////// // 最佳實踐 // ////////////// // 定義對象的set存取器屬性時,強制定義get "accessor-pairs":2, // 強制數組方法的回調函數中有 return 語句 "array-callback-return":0, // 強制把變量的使用限制在其定義的做用域範圍內 "block-scoped-var":0, // 限制圈複雜度,也就是相似if else能連續接多少個 "complexity": [2,9], // 要求 return 語句要麼老是指定返回的值,要麼不指定 "consistent-return":0, // 強制全部控制語句使用一致的括號風格 "curly": [2,"all"], // switch 語句強制 default 分支,也可添加 // no default 註釋取消這次警告 "default-case":2, // 強制object.key 中 . 的位置,參數: // property,'.'號應與屬性在同一行 // object, '.' 號應與對象名在同一行 "dot-location": [2,"property"], // 強制使用.號取屬性 // 參數: allowKeywords:true 使用保留字作屬性名時,只能使用.方式取屬性 // false 使用保留字作屬性名時, 只能使用[]方式取屬性 e.g [2, {"allowKeywords": false}] // allowPattern: 當屬性名匹配提供的正則表達式時,容許使用[]方式取值,不然只能用.號取值 e.g [2, {"allowPattern": "^[a-z]+(_[a-z]+)+$"}] "dot-notation": [2, {"allowKeywords":false}], // 使用 === 替代 == allow-null容許null和undefined== "eqeqeq": [2,"allow-null"], // 要求 for-in 循環中有一個 if 語句 "guard-for-in":2, // 禁用 alert、confirm 和 prompt "no-alert":0, // 禁用 arguments.caller 或 arguments.callee "no-caller":2, // 不容許在 case 子句中使用詞法聲明 "no-case-declarations":2, // 禁止除法操做符顯式的出如今正則表達式開始的位置 "no-div-regex":2, // 禁止 if 語句中有 return 以後有 else "no-else-return":0, // 禁止出現空函數.若是一個函數包含了一條註釋,它將不會被認爲有問題。 "no-empty-function":2, // 禁止使用空解構模式no-empty-pattern "no-empty-pattern":2, // 禁止在沒有類型檢查操做符的狀況下與 null 進行比較 "no-eq-null":1, // 禁用 eval() "no-eval":2, // 禁止擴展原生類型 "no-extend-native":2, // 禁止沒必要要的 .bind() 調用 "no-extra-bind":2, // 禁用沒必要要的標籤 "no-extra-label:":0, // 禁止 case 語句落空 "no-fallthrough":2, // 禁止數字字面量中使用前導和末尾小數點 "no-floating-decimal":