團隊自定義 tslint & eslint 詳細規則

小黎也發表於2018-07-01

符合自身場景的就是最好的,希望能給大夥帶來參考

前端工程化之路-語法檢查

上一篇說的詳細配置檔案如下

tslint.json

{
    "defaultSeverity": "error",
    "extends": [
        "tslint:recommended"
    ],
    "jsRules": {
        "no-unused-expression": true
    },
    "rules": {
        "align": [
            true,
            "parameters",
            "statements"
        ],
        "array-type": false,
        "arrow-parens": false,
        "curly": true,
        "eofline": false,
        "forin": true,
        "indent": [
            true,
            "spaces",
            4
        ],
        "interface-name": [
            true,
            "always-prefix"
        ],
        "label-position": true,
        "linebreak-style": [
            true,
            "CRLF"
        ],
        "max-classes-per-file": [
            false
        ],
        "max-file-line-count": [
            true,
            1000
        ],
        "max-line-length": [
            true,
            160
        ],
        "member-access": [
            true,
            "check-accessor"
        ],
        "member-ordering": [
            false
        ],
        "new-parens": true,
        "no-consecutive-blank-lines": true,
        "no-console": [
            true,
            "log",
            "error"
        ],
        "no-construct": true,
        "no-debugger": true,
        "no-duplicate-variable": [
            true,
            "check-parameters"
        ],
        "no-empty": [
            true,
            "allow-empty-catch"
        ],
        "no-empty-interface": false,
        "no-eval": true,
        "no-invalid-this": [
            true,
            "check-function-in-method"
        ],
        "no-shadowed-variable": [
            true,
            {
                "class": true,
                "enum": true,
                "function": true,
                "interface": false,
                "namespace": true,
                "typeAlias": false,
                "typeParameter": false
            }
        ],
        "no-switch-case-fall-through": true,
        "no-trailing-whitespace": [
            true,
            "ignore-jsdoc",
            "ignore-comments",
            "ignore-blank-lines"
        ],
        "no-unused-expression": [
            true,
            "allow-fast-null-checks"
        ],
        "no-unused-variable": [
            true,
            {
                "ignore-pattern": "^_"
            }
        ],
        "no-use-before-declare": true,
        "no-var-keyword": true,
        "object-literal-key-quotes": [
            true,
            "as-needed"
        ],
        "object-literal-sort-keys": false,
        "one-line": false,
        "one-variable-per-declaration": [
            true,
            "ignore-for-loop"
        ],
        "no-duplicate-super": true,
        "no-return-await": true,
        "prefer-const": [
            true,
            {
                "destructuring": "all"
            }
        ],
        "quotemark": [
            true,
            "single",
            "avoid-escape",
            "avoid-template"
        ],
        "radix": true,
        "semicolon": [
            true,
            "always"
        ],
        "switch-default": true,
        "trailing-comma": false,
        "triple-equals": [
            true,
            "allow-undefined-check"
        ],
        "variable-name": [
            true,
            "allow-pascal-case"
        ],
        "no-string-literal": false,
        "no-require-imports": true,
        "only-arrow-functions": [
            true,
            "allow-declarations",
            "allow-named-functions"
        ],
        "jsdoc-format": [
            true,
            "check-multiline-start"
        ],
        "switch-final-break": [
            true,
            "always"
        ]
    },
    "rulesDirectory": []
}
複製程式碼

----------------------------------我是分割線 咔 咔 咔 咔----------------------------------

.eslintrc.js

module.exports = {
    // 全域性變數
    'env': {
        'browser': true,
        'commonjs': true,
        'es6': true,
        'node': true,
        'worker': true,
        'jquery': true
    },
    'extends': [
        "standard",
        "eslint:recommended",
        "plugin:react/recommended",
        "plugin:vue/base",
    ],
    'parserOptions': {
        "parser": "babel-eslint",
        'ecmaFeatures': {
            // 啟用對實驗性的 object rest/spread properties 的支援。
            'experimentalObjectRestSpread': true,
            'jsx': true,
            'globalReturn': false,
            // 啟用全域性 strict mode
            'impliedStrict': true
        },
        // 設定為 'script' (預設) 或 'module'(如果你的程式碼是 ECMAScript 模組)。
        'sourceType': 'module',
        // 設定為 3, 5 (預設), 6、7 或 8 指定你想要使用的 ECMAScript 版本。你也可以指定為 2015(同 6),2016(同 7),或 2017(同 8)使用年份命名
        'ecmaVersion': 7
    },
    'plugins': [
    ],
    'rules': {

        /*
         * ------------------------------------------------
         * Possible Errors
         * 以下規則與 JavaScript 程式碼中可能的錯誤或邏輯錯誤有關
         * ------------------------------------------------
         */

        //react 相關配置項
        "react/forbid-prop-types": [0],
        "react/jsx-filename-extension": [1, { "extensions": [".js"] }],
        "react/jsx-no-bind": [0],
        "react/jsx-indent": [2, 4],
        "react/jsx-indent-props": [2, 4],
        "react/jsx-uses-react": "error",
        "react/jsx-uses-vars": "error",
        "react/prop-types": [0],
        "react/prefer-stateless-function": [0],
        "react/jsx-wrap-multilines": [
            "error",
            {
                "declaration": "parens-new-line",
                "assignment": "parens-new-line",
                "return": "parens-new-line",
                "arrow": "parens-new-line",
                "condition": "parens-new-line",
                "logical": "parens-new-line",
                "prop": "ignore"
            }
        ],
        "jsx-a11y/no-static-element-interactions": [0],
        "jsx-a11y/no-noninteractive-element-interactions": [0],
        "jsx-a11y/click-events-have-key-events": [0],
        "jsx-a11y/anchor-is-valid": [0],

        // 禁止在常規字串中出現模板字面量佔位符語法
        'no-template-curly-in-string': 1,
        // error; for循轉方向出錯
        'for-direction': 2,
        // error; getter必須有返回值,並且禁止返回值為undefined, 比如 return;
        'getter-return': [2, { 'allowImplicit': false }],
        // error; 禁止在迴圈中出現 await
        'no-await-in-loop': 2,
        // error; 不允許使用console進行程式碼除錯
        'no-console': 2,
        // error; 不允許使用debugger進行程式碼除錯
        'no-debugger': 2,

        /*
         * ------------------------------------------------
         * Best Practices
         * 這些規則是關於最佳實踐的,幫助你避免一些問題
         * ------------------------------------------------
         */

        // error; 強制 getter 和 setter 在物件中成對出現
        'accessor-pairs': 2,
        // off; 對於資料相關操作函式比如reduce, map, filter等,callback必須有return
        'array-callback-return': 0,
        // error; 把var關鍵字看成塊級作用域,防止變數提升導致的bug
        'block-scoped-var': 2,
        // error; class this
        'class-methods-use-this': 0,
        // error; 禁止或強制在計算屬性中使用空格
        'computed-property-spacing': [2, 'never'],
        // error; 要求遵循大括號約定
        'curly': [2, 'all'],
        // error; switch case語句裡面一定需要default分支
        'default-case': 2,
        // error; 要求點操作符和屬性放在同一行
        'dot-location': [2, 'property'],
        // warn; 推薦.操作符
        'dot-notation': [1, { 'allowKeywords': false }],
        // error; === !==
        'eqeqeq': 2,
        // error; 禁止使用看起來像除法的正規表示式
        'no-div-regex': 2,
        // error; 禁止在 else 前有 return
        'no-else-return': 2,
        // error; 不允許使用空函式,除非在空函式裡面給出註釋說明
        'no-empty-function': 2,
        // error; if (foo === null)
        'no-eq-null': 2,
        // error; 程式碼中不允許使用eval
        'no-eval': 2,
        // error; 禁止修改原生物件
        'no-extend-native': [2, { 'exceptions': ['Object', 'Promise'] }],
        // error; 禁止出現沒必要的 bind
        'no-extra-bind': 2,
        // error; 表示小數時,禁止省略 0,比如 .5
        'no-floating-decimal': 2,
        // error; 強制型別轉換
        'no-implicit-coercion': [2, { 'boolean': false, 'string': false }],
        // this關鍵字出現在類和類物件之外 todo
        'no-invalid-this': 1,
        // error; 禁止使用類似 eval() 的方法
        'no-implied-eval': 2,
        // error; 禁止使用 __iterator__
        'no-iterator': 2,
        // error; 禁用標籤語句
        'no-labels': 2,
        // error; 禁止迴圈中存在函式
        'no-loop-func': 2,
        // error; 禁止使用沒必要的 {} 作為程式碼塊
        'no-lone-blocks': 2,
        // error; 禁止出現連續的多個空格,除非是註釋前,或對齊物件的屬性、變數定義、import 等
        'no-multi-spaces': [2, {
            'ignoreEOLComments': true,
            'exceptions': { 'Property': true, 'BinaryExpression': false, 'VariableDeclarator': true, 'ImportDeclaration': true }
        }],
        // error; 禁止多行字串
        'no-multi-str': 2,
        // error; 禁止直接 new 一個類而不賦值
        'no-new': 2,
        // error; 禁止使用 new Function,比如 const expression = new Function('a', 'b', 'return a + b');
        'no-new-func': 2,
        // error; 對於JS的原始型別比如String, Number, Boolean等,不允許使用new 操作符
        'no-new-wrappers': 2,
        // warn; 不推薦對 function 的引數進行重新賦值
        'no-param-reassign': 1,
        // error; 禁止直接使用__proto__屬性,可以使用getPrototypeOf替代
        'no-proto': 2,
        // error; 禁止在 return 語句中使用賦值語句
        'no-return-assign': 2,
        // error; 禁止在 return 語句中使用await
        'no-return-await': 2,
        // warn; 不推薦逗號操作符
        'no-sequences': 1,
        // error; 禁止丟擲異常字面量
        'no-throw-literal': 2,
        // error; 禁用一成不變的迴圈條件
        'no-unmodified-loop-condition': 2,
        // error; 禁止出現未使用過的表示式
        'no-unused-expressions': 2,
        // error; 禁止不必要的 .call() 和 .apply()
        'no-useless-call': 2,
        // error; 禁止出現沒必要的字串拼接,比如 'hello' + 'world',可以直接寫成'hello world'
        'no-useless-concat': 2,
        // error; disallow redundant return statements
        'no-useless-return': 2,
        // 禁用 Alert
        'no-alert': 2,
        // 禁用 Script URL
        'no-script-url': 2,
        // error; 對數字使用 parseInt 並且總是帶上型別轉換的基數
        'radix': 2,
        // error; async函式裡面必須有await
        'require-await': 0,
        // error; 要求所有的 var 宣告出現在它們所在的作用域頂部
        'vars-on-top': 2,
        // warn; 推薦yoda表示式
        'yoda': [1, 'always'],
        // 需要約束 for-in
        'guard-for-in': 2,

        /*
         * ------------------------------------------------
         * Variables
         * 這些規則與變數宣告有關
         * ------------------------------------------------
         */

        // error; 禁止 catch 子句的引數與外層作用域中的變數同名
        'no-catch-shadow': 2,
        // error; 禁用特定的全域性變數
        'no-restricted-globals': 2,
        // error; 禁止變數宣告與外層作用域的變數同名
        'no-shadow': 2,
        // error; js關鍵字和保留字不能作為函式名或者變數名
        'no-shadow-restricted-names': 2,
        // error; 禁止label名稱和var相同
        'no-label-var': 2,
        // error; 避免初始化變數值為 undefined
        'no-undef-init': 2,
        // error; 禁止將undefined當成標誌符
        'no-undefined': 2,
        // error; 變數使用之前必須進行定義,函式除外
        'no-use-before-define': [2, { 'functions': false }],

        /*
         * ------------------------------------------------
         * Stylistic Issues
         * 這些規則是關於風格指南的,而且是非常主觀的
         * ------------------------------------------------
         */

        // error; 是否允許非空陣列裡面有多餘的空格
        'array-bracket-spacing': [2, 'never'],
        // warn; 大括號風格
        'brace-style': [1, '1tbs'],
        // error; 變數命名需要以駝峰命名法,對屬性欄位不做限制
        'camelcase': [2, { 'properties': 'never' }],
        // error; 物件字面量項尾不能有逗號
        'comma-dangle': [2, 'never'],
        // error; 逗號風格,換行時在行首還是行尾
        'comma-style': [2, 'last'],
        // error; 當獲取當前執行環境的上下文時,強制使用一致的命名
        'consistent-this': [2, 'self', 'that'],
        // error; 函式名和執行它的括號之間禁止有空格
        'func-call-spacing': [2, 'never'],
        // error; 強制一致地使用 function 宣告或表示式
        'func-style': [2, 'declaration', { 'allowArrowFunctions': true }],
        // error; 一個縮排必須用四個空格替代, switch語句裡面的case 2個空格
        'indent': [2, 4, { 'SwitchCase': 2 }],
        // error; 物件字面量中冒號前面禁止有空格,後面必須有空格
        'key-spacing': [2, { 'beforeColon': false, 'afterColon': true, 'mode': 'strict' }],
        // error; 關鍵字前後必須要加上空格
        'keyword-spacing': [2, { 'before': true, 'after': true }],
        // off; 不限制註釋位置
        'line-comment-position': 0,
        // error; 換行符
        'linebreak-style': [2, 'windows'],
        // warn; 註釋前有一空行
        'lines-around-comment': [1, { 'beforeBlockComment': true, 'beforeLineComment': true }],
        // error; 強制可巢狀的塊的最大深度
        'max-depth': [2, { max: 4 }],
        // warn; 單行最多允許160個字元, 對包含url的行不進行此限制
        'max-len': [1, { 'code': 160, 'ignoreUrls': true, 'ignoreComments': true, 'ignoreStrings': true, 'ignoreTemplateLiterals': true, 'ignoreRegExpLiterals': true }],
        // warn; 強制回撥函式最大巢狀深度
        'max-nested-callbacks': [2, { 'max': 3 }],
        // error; 建構函式的必須以大寫字母開頭
        'new-cap': 2,
        // error; new 後面類必須帶上括號
        'new-parens': 2,
        // error; 禁止使用 Array 建構函式
        'no-array-constructor': 2,
        // error; no continue
        'no-continue': 2,
        // error; 禁止 if 語句作為唯一語句出現在 else 語句塊中
        'no-lonely-if': 2,
        // warn; 不允許多個空行
        'no-multiple-empty-lines': [1, { 'max': 1 }],
        // error; 禁止使用巢狀的三元表示式
        'no-nested-ternary': 2,
        // error; 禁用 Object 的建構函式
        'no-new-object': 2,
        // error; 強制在花括號內使用一致的換行符
        'object-curly-newline': [2, { 'multiline': true }],
        // error; 強制將物件的屬性放在不同的行上
        'object-property-newline': 2,
        // error; 變數申明必須每行一個
        'one-var': [2, 'never'],
        // warn; 變數申明必須每行一個
        'one-var-declaration-per-line': [2, 'always'],
        // error; 換行時運算子在行尾還是行首
        'operator-linebreak': [2, 'after'],
        // warn; 控制程式碼padding
        'padding-line-between-statements': [1, { blankLine: 'always', prev: ['const', 'let', 'var'], next: '*' }, { blankLine: 'any', prev: ['const', 'let', 'var'], next: ['const', 'let', 'var'] }],
        // error; 必須使用單引號
        'quotes': [2, 'single', { 'avoidEscape': true, 'allowTemplateLiterals': true }],
        // warn; 推薦jsdoc註釋
        'require-jsdoc': [1, { 'require': { 'FunctionDeclaration': true, 'MethodDefinition': false, 'ClassDeclaration': false, 'ArrowFunctionExpression': false } }],
        // error; 結尾必須有分號
        'semi': [2, 'always'],
        // error; 一行有多個語句時,分號前面禁止有空格,分號後面必須有空格
        'semi-spacing': [2, { 'before': false, 'after': true }],
        // error; 分號必須寫在行尾,禁止在行首出現
        'semi-style': [2, 'last'],
        // error; if, function 等的大括號之前必須要有空格
        'space-before-blocks': [2, 'always'],
        // error; 註釋空格
        'spaced-comment': [2, 'always', { 'line': { 'markers': ['/'], 'exceptions': ['-', '+'] }, 'block': { 'markers': ['!'], 'exceptions': ['*'], 'balanced': true } }],
        // error; case 子句冒號前禁止有空格,冒號後必須有空格
        'switch-colon-spacing': [2, { 'after': true, 'before': false }],
        // 鏈式呼叫必須換行
        'newline-per-chained-call': 2,

        /*
         * ------------------------------------------------
         * ECMAScript 6
         * 這些規則只與 ES6 有關
         * ------------------------------------------------
         */

        // error; 箭頭函式的箭頭前後必須有空格
        'arrow-spacing': [2, { 'before': true, 'after': true }],
        // error; 禁止import重複模組
        'no-duplicate-imports': 2,
        // error; 要求使用 let 或 const 而不是 var
        'no-var': 2,
        // warn; 推薦使用箭頭函式作為回撥
        'prefer-arrow-callback': [1, { 'allowNamedFunctions': true }],
        // error; 使用const
        'prefer-const': [2, { 'destructuring': 'any', 'ignoreReadBeforeAssign': false }],
        // warn; 推薦結構賦值
        'prefer-destructuring': [1, { 'array': true, 'object': true }, { 'enforceForRenamedProperties': false }],
        // warn; 推薦rest運算子
        'prefer-rest-params': 1,
        // warn; 推薦擴充套件運算子
        'prefer-spread': 1,
        // error; rest 空格
        'rest-spread-spacing': [2, 'never'],
        // error; require symbol description
        'symbol-description': 2,
        // 禁止在物件中使用不必要的計算屬性
        'no-useless-computed-key': 1,
        // 禁用不必要的建構函式
        'no-useless-constructor': 2
    }
};
複製程式碼

相關文章