vue3使用ESLint+Prettier代碼規(guī)范 (附帶詳細配置)

中間監(jiān)測到什么語法問題蜕乡,可以見另外一篇??
eslint 常見錯誤合集

ESLint 入門

ESLint 是一種用于識別和報告 ECMAScript/JavaScript 代碼中發(fā)現(xiàn)的模式的工具影锈,其目標是使代碼更加一致并避免錯誤。

npm add -D eslint

初始化ESLint配置

npx eslint --init

選prettier規(guī)定格式蹄溉。安裝完成后(根目錄會生成.eslintrc.js文件)這個配置文件是默認生成的,還不能用于項目后面會修改此配置文件冤竹。

插件及vite配置

1.安裝vite-plugin-eslint

npm add -D vite-plugin-eslint

2.安裝eslint-parser

npm add @babel/core @babel/eslint-parser -D

3.vite.config.js 配置

// vite.config.js

import eslintPlugin from 'vite-plugin-eslint';
export default defineConfig({
 plugins: [
        ...
        eslintPlugin({
            include: [
                'src/**/*.ts',
                'src/**/*.js',
                'src/**/**/*.vue',
                'src/**/**/**/*.vue',
                'src/**/**/**/**/*.vue',
                'src/*.ts',
                'src/*.vue',
                // 根據(jù)自己目錄深度配置
            ],
        }),
})

vscode安裝插件

eslint

prettier

prettier安裝及配置

1.安裝prettier

npm add prettier eslint-config-prettier eslint-plugin-prettier -D

2.配置.prettierrc.js
在根目錄下面添加.prettierrc.js文件夾溶浴,可以根據(jù)代碼規(guī)范將下面參數(shù)配置在其中。其實也用不了配置這么多,保存的時候 會自動根據(jù)規(guī)則補全闸迷。

/** .prettierrc.js
* 在VSCode中安裝prettier插件 打開插件配置填寫`.prettierrc.js` 將本文件作為其代碼格式化規(guī)范
* 在本文件中修改格式化規(guī)則嵌纲,不會同時觸發(fā)改變ESLint代碼檢查,所以每次修改本文件需要重啟VSCode腥沽,ESLint檢查才能同步代碼格式化
* 需要相應(yīng)的代碼格式化規(guī)范請自行查閱配置逮走,下面為默認項目配置
*/
module.exports = {
  // 一行最多多少個字符
  printWidth: 150,
  // 指定每個縮進級別的空格數(shù)
  tabWidth: 4,
  // 使用制表符而不是空格縮進行
  useTabs: true,
  // 在語句末尾是否需要分號
  semi: true,
  // 是否使用單引號
  singleQuote: true,
  // 更改引用對象屬性的時間 可選值"<as-needed|consistent|preserve>"
  quoteProps: 'as-needed',
  // 在JSX中使用單引號而不是雙引號
  jsxSingleQuote: false,
  // 多行時盡可能打印尾隨逗號。(例如今阳,單行數(shù)組永遠不會出現(xiàn)逗號結(jié)尾师溅。) 可選值"<none|es5|all>",默認none
  trailingComma: 'es5',
  // 在對象文字中的括號之間打印空格
  bracketSpacing: true,
  // jsx 標簽的反尖括號需要換行
  jsxBracketSameLine: false,
  // 在單獨的箭頭函數(shù)參數(shù)周圍包括括號 always:(x) => x \ avoid:x => x
  arrowParens: 'always',
  // 這兩個選項可用于格式化以給定字符偏移量(分別包括和不包括)開始和結(jié)束的代碼
  rangeStart: 0,
  rangeEnd: Infinity,
  // 指定要使用的解析器,不需要寫文件開頭的 @prettier
  requirePragma: false,
  // 不需要自動在文件開頭插入 @prettier
  insertPragma: false,
  // 使用默認的折行標準 always\never\preserve
  proseWrap: 'preserve',
  // 指定HTML文件的全局空格敏感度 css\strict\ignore
  htmlWhitespaceSensitivity: 'css',
  // Vue文件腳本和樣式標簽縮進
  vueIndentScriptAndStyle: false,
  //在 windows 操作系統(tǒng)中換行符通常是回車 (CR) 加換行分隔符 (LF),也就是回車換行(CRLF)舔痪,
  //然而在 Linux 和 Unix 中只使用簡單的換行分隔符 (LF)蟆炊。
  //對應(yīng)的控制字符為 "\n" (LF) 和 "\r\n"(CRLF)。auto意為保持現(xiàn)有的行尾
  // 換行符使用 lf 結(jié)尾是 可選值"<auto|lf|crlf|cr>"
  endOfLine: 'auto',
}; 

但是eslint 和prettier 自帶的規(guī)則是不合的枢赔,有沖突,需要更改.eslintrc.js 配置, 下面是基礎(chǔ)配置,如果還需什么配置嗡载,可以從最下面的詳細配置里面去取。


/*
 *   如果同一目錄下 .eslintrc 和 package.json 同時存在铸史,.eslintrc 優(yōu)先級高會被使用鼻疮,package.json 文件將不會被使用
 */
module.exports = {
    root: true, // 默認情況下,ESLint 會在所有父級目錄里尋找配置文件琳轿,一直到根目錄; 一旦發(fā)現(xiàn)配置文件中有 "root": true判沟,它就會停止在父級目錄中尋找
    env: {
        browser: true,
        node: true,
    },
    extends: [
        'eslint-config-prettier',
        'eslint:recommended', // 使用推薦的eslint
        'plugin:@typescript-eslint/recommended',
        'plugin:vue/vue3-recommended', // 使用插件支持vue3
        'plugin:vue/vue3-essential',
        //1.繼承.prettierrc.js文件規(guī)則2.開啟rules的 "prettier/prettier": "error"3.eslint fix的同時執(zhí)行prettier格式化
        'plugin:prettier/recommended',
    ],
    parser: 'vue-eslint-parser',
    parserOptions: {
        ecmaVersion: 2020,
        type: 'module',
        sourceType: 'moudule',
        parser: '@typescript-eslint/parser',
    },
    plugins: [],
    globals: {
        defineProps: 'readonly',
        defineEmits: 'readonly',
        defineExpose: 'readonly',
        withDefaults: 'readonly',
    },
    rules: {
        'no-console':
            process.env.NODE_ENV === 'production'
                ? ['error', { allow: ['error', 'warn'] }]
                : 'off', //生產(chǎn)模式不允許使用log
        'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', //生產(chǎn)默認不允許使用debugger
        '@typescript-eslint/no-unused-vars': [
            'error',
            { varsIgnorePattern: '.*', args: 'none' },
        ], //變量聲明未使用
        '@typescript-eslint/no-explicit-any': 'off', // 允許ts使用any
        // '@typescript-eslint/no-var-requires': 'off', // 強制使用 import 且不允許使用 require 設(shè)置off關(guān)閉檢查
        // 'vue/require-v-for-key': 'off', // 對保留元素檢查 vue3中v-for會自動追加key值,所以不用再強制添加key屬性崭篡,所以不檢查key的填寫
        // 'vue/valid-v-for': 'off', // 對于非保留(自定義)元素檢查vue3中v-for會自動追加key值挪哄,所以不用再強制添加key屬性,所以不檢查key的填寫
        // 添加組件命名忽略規(guī)則 vue官方默認規(guī)則是多單詞駝峰來進行組件命名, 如果為off 則表示關(guān)閉命名規(guī)范校驗
        'vue/multi-word-component-names': [
            'warn',
            {
                ignores: ['index', 'home', 'layout', 'user'], //需要忽略的組件名
            },
        ],
        'no-func-assign': 2, //禁止重復(fù)的函數(shù)聲明

        'no-implicit-coercion': 1, //禁止隱式轉(zhuǎn)換

        'no-implied-eval': 2, //禁止使用隱式eval

        'no-inline-comments': 0, //禁止行內(nèi)備注

        'block-scoped-var': 0, //塊語句中使用var
        eqeqeq: 2, //必須使用全等
        indent: ['error', 4], //縮進風格
        "complexity": [1, 10], // 添加復(fù)雜度
    },
};

運行eslint代碼規(guī)范

我更推薦把執(zhí)行命令寫入package.json

"scripts": {
    ...
    "lint": "eslint --fix --ext .ts,.js,.vue src" 
  },

參數(shù)說明: eslint --fix . 根據(jù)eslintrc配置修復(fù)項目下所有的js文件琉闪,不包含自己迹炼; --ext .ts,.js,.vue src 指定修復(fù)src目錄下的.ts,.js文件,后綴名用逗號隔開颠毙。

當然eslint 也可以設(shè)置需要忽略掉的文件夾 node_modules和dist斯入。
根目錄下創(chuàng)建eslint忽略文件配置.eslintignore,來指定我們不需要進行檢查的目錄或文件

/**
* 參考文檔
* https://zh-hans.eslint.org/docs/latest/use/configure/ignore
*/
{
    "ignorePatterns": ["temp.js", "**/vendor/*.js", "dist", "node_modules"],
    "rules": {
        //...
    }
}

ESLintrc.js詳細參數(shù)

/**
 * 參考文檔
 * 【eslint英文文檔】https://eslint.org/docs/user-guide/configuring
 * 【eslint中文文檔】http://eslint.cn/docs/rules/
 */
/**
 * eslint有三種使用方式
 * 【1】js代碼中通過注釋的方式使用
 * 【2】通過webpack的eslintConfig字段設(shè)置蛀蜜,eslint會自動搜索項目的package.json文件中的配置
 * 【3】通過配置文件的方式使用刻两,配置文件有多種文件方式,如JavaScript滴某、JSON 或者 YAML等
 */

/**
 * 文件忽略
 * 【】讓eslint跳過特定文件的檢測
 * 【】通過當前工作目錄下 「.eslintignore」 文件進行設(shè)置
 *    其使用的是Glob路徑書寫方式磅摹,與「.gitignore」的使用方法相同
 * 【】也可以在 package.json 文件中滋迈,通過 eslintIgnore 參數(shù)進行設(shè)置
 */

/**
 * 文件內(nèi)局部設(shè)置
 * 【】eslint可以具體文件中設(shè)置特定代碼的規(guī)則,常用于跳過某條語句的檢測户誓。
 * 【】注銷全部規(guī)則饼灿,在代碼前新建一行,添加注銷 /* eslint-disable *\/   帝美。如果沒有恢復(fù)設(shè)置的語句碍彭,則下列全部代碼都會跳過檢測。
 * 【】恢復(fù)eslint证舟,在代碼前新建一行硕旗,添加注銷 /* eslint-enable *\/
 * 【】指定忽略的規(guī)則,/* eslint-disable no-alert, no-console *\/
 * 【】在特定行禁用女责,// eslint-disable-line
 * 【】在下一行禁用漆枚,// eslint-disable-next-line
 */

module.exports = {

  /**
   * 根目錄標識
   *  http://eslint.cn/docs/user-guide/configuring#using-configuration-files
   *  http://eslint.cn/docs/user-guide/configuring#configuration-cascading-and-hierarchy
   * 【】標識當前配置文件為最底層的文件,無需往更上一級的文件目錄中進行搜索
   * 【】默認eslint的配置文件搜索方式是抵知,從目標文件夾進行搜索墙基,遍歷內(nèi)部每一個文件夾,找到配置文件并層疊使用刷喜。再跳出本項目残制,往祖先文件夾進行遍歷
   * 【】注意「~/.eslintrc」的意義,「~」是指linux上的家目錄掖疮,「~/.eslintrc」是指家目錄下的eslint配置文件初茶,用于私人開發(fā)者,用于整個電腦全局約束的浊闪。這個配置通過本配置項root去設(shè)置恼布,設(shè)置了root,eslint檢測時將不會再往上搜索
   * 【】eslint的生效規(guī)則是就近使用,越近的配置項優(yōu)先級越高搁宾,覆蓋其他配置項折汞。如一個項目中,可以在不同文件夾中都添加配置文件盖腿,這些規(guī)則將重疊組合生效
   */
  root: true, // 標識當前配置文件為eslint的根配置文件爽待,讓其停止在父級目錄中繼續(xù)尋找。


  /**
   * 解析器
   *  http://eslint.cn/docs/user-guide/configuring#specifying-parser
   * 【】ESLint 默認使用Espree作為其解析器
   * 【】解析器必須是本地安裝的一個 npm 模塊翩腐。即必須按照在本地的node_module中
   * 【】解析器是用于解析js代碼的鸟款,怎么去理解每一個表達式,有點C++中編譯器的概念茂卦,會對js進行一些語法分析欠雌,語義分析什么的,才能判斷語句符不符合規(guī)范疙筹。而不是通過簡單的字符串對比富俄。
   * 【】解析器有很多,但兼容eslint的解析器有以下幾個
   *  Espree:默認解析器而咆,一個從Esprima中分離出來的解析器霍比,做了一些優(yōu)化
   *  Esprima:js標準解析器
   *  Babel-ESLint: 一個對Babel解析器的包裝,babel本身也是js解析器的一種(不然怎么能轉(zhuǎn)化為兼容性代碼呢暴备?首先需要進行js解析悠瞬,才能轉(zhuǎn)化)。如果我們的代碼需要經(jīng)過babel轉(zhuǎn)化涯捻,則對應(yīng)使用這個解析器
   *  typescript-eslint-parser(實驗) - 一個把 TypeScript 轉(zhuǎn)換為 ESTree 兼容格式的解析器
   * 【】但是通常在vue項目中浅妆,并不會寫在 parser 字段中,而是寫在 parserOptions -&gt; parser障癌。具體原因在 parserOptions 一欄中介紹
   */
  // parser: 'babel-eslint',


  /**
   * 解析器配置項
   *  http://eslint.cn/docs/user-guide/configuring#specifying-parser-options
   * 【】這里設(shè)置的配置項將會傳遞到解析器中凌外,被解析器獲取到,進行一定的處理涛浙。具體被利用到康辑,要看解析器的源碼有沒有對其進行利用。這里僅僅做了參數(shù)定義轿亮,做了規(guī)定疮薇,告訴解析器的開發(fā)者可能有這些參數(shù)
   * 【】配置項目有:
   * "sourceType": "module",    // 指定JS代碼來源的類型,script(script標簽引入我注?) | module(es6的module模塊)按咒,默認為script。為什么vue的會使用script呢但骨?因為vue是通過babel-loader編譯的励七,而babel編譯后的代碼就是script方式
   * "ecmaVersion": 6,          // 支持的ES語法版本,默認為5嗽冒。注意只是語法呀伙,不包括ES的全局變量。全局變量需要在env選項中進行定義
   * "ecmaFeatures": {          // Features是特征的意思添坊,這里用于指定要使用其他那些語言對象
       "experimentalObjectRestSpread": true,  //啟用對對象的擴展
       "jsx": true,                           //啟用jsx語法
       "globalReturn":true,                   //允許return在全局使用
       "impliedStrict":true                   //啟用嚴格校驗?zāi)J?     }
   */
  parserOptions: {
    /**
     * 這里出現(xiàn) parser 的原因
     * 【】首先明確一點剿另,官方說明中,parserOptions的配置參數(shù)是不包括 parser 的
     * 【】這里的寫 parser 是 eslint-plugin-vue 的要求贬蛙,是 eslint-plugin-vue 的自定義參數(shù)
     * 【】根據(jù)官方文檔雨女,eslint-plugin-vue 插件依賴 「vue-eslint-parser」解析器⊙糇迹「vue-eslint-parser」解析器氛堕,只解析 .vue 中html部分的內(nèi)容,不會檢測&lt;script&gt;中的JS內(nèi)容野蝇。
     * 【】由于解析器只有一個讼稚,用了「vue-eslint-parser」就不能用「babel-eslint」括儒。所以「vue-eslint-parser」的做法是,在解析器選項中锐想,再傳入一個解析器選項parser帮寻。從而在內(nèi)部處理「babel-eslint」,檢測&lt;script&gt;中的js代碼
     * 【】所以這里出現(xiàn)了 parser
     * 【】相關(guān)文檔地址赠摇,https://vuejs.github.io/eslint-plugin-vue/user-guide/#usage
     */
    parser: 'babel-eslint',
  },


  /**
   * 運行環(huán)境
   *  http://eslint.cn/docs/user-guide/configuring#specifying-environments
   * 【】一個環(huán)境定義了一組預(yù)定義的全局變量
   * 【】獲得了特定環(huán)境的全局定義固逗,就不會認為是開發(fā)定義的,跳過對其的定義檢測藕帜。否則會被認為改變量未定義
   * 【】常見的運行環(huán)境有以下這些烫罩,更多的可查看官網(wǎng)
   *  browser - 瀏覽器環(huán)境中的全局變量。
   *  node - Node.js 全局變量和 Node.js 作用域洽故。
   *  es6 - 啟用除了 modules 以外的所有 ECMAScript 6 特性(該選項會自動設(shè)置 ecmaVersion 解析器選項為 6)贝攒。
   *  amd - 將 require() 和 define() 定義為像 amd 一樣的全局變量。
   *  commonjs - CommonJS 全局變量和 CommonJS 作用域 (用于 Browserify/WebPack 打包的只在瀏覽器中運行的代碼)收津。
   *  jquery - jQuery 全局變量饿这。
   *  mongo - MongoDB 全局變量。
   *  worker - Web Workers 全局變量撞秋。
   *  serviceworker - Service Worker 全局變量长捧。
   */
  env: {
    browser: true, // 瀏覽器環(huán)境
  },


  /**
   * 全局變量
   * http://eslint.cn/docs/user-guide/configuring#specifying-globals
   * 【】定義額外的全局,開發(fā)者自定義的全局變量吻贿,讓其跳過no-undef 規(guī)則
   * 【】key值就是額外添加的全局變量
   * 【】value值用于標識該變量能否被重寫串结,類似于const的作用。true為允許變量被重寫
   * 【】注意:要啟用no-global-assign規(guī)則來禁止對只讀的全局變量進行修改舅列。
   */
  globals: {
    // gTool: true, // 例如定義gTool這個全局變量肌割,且這個變量可以被重寫
  },


  /**
   * 插件
   * http://eslint.cn/docs/user-guide/configuring#configuring-plugins
   * 【】插件同樣需要在node_module中下載
   * 【】注意插件名忽略了「eslint-plugin-」前綴,所以在package.json中帐要,對應(yīng)的項目名是「eslint-plugin-vue」
   * 【】插件的作用類似于解析器把敞,用以擴展解析器的功能,用于檢測非常規(guī)的js代碼榨惠。也可能會新增一些特定的規(guī)則奋早。
   * 【】如 eslint-plugin-vue,是為了幫助我們檢測.vue文件中 &lt;template&gt; 和 &lt;script&gt; 中的js代碼
   */
  plugins: ['vue'],


  /**
   * 規(guī)則繼承
   * http://eslint.cn/docs/user-guide/configuring#extending-configuration-files
   *【】可繼承的方式有以下幾種
   *【】eslint內(nèi)置推薦規(guī)則赠橙,就只有一個耽装,即「eslint:recommended」
   *【】可共享的配置, 是一個 npm 包期揪,它輸出一個配置對象掉奄。即通過npm安裝到node_module中
   *   可共享的配置可以省略包名的前綴 eslint-config-,即實際設(shè)置安裝的包名是 eslint-config-airbnb-base
   *【】從插件中獲取的規(guī)則凤薛,書寫規(guī)則為 「plugin:插件包名/配置名」姓建,其中插件報名也是可以忽略「eslint-plugin-」前綴诞仓。如'plugin:vue/essential'
   *【】從配置文件中繼承,即繼承另外的一個配置文件速兔,如'./node_modules/coding-standard/eslintDefaults.js'
   */
  extends: [
    /**
     * vue 的額外添加的規(guī)則是 v-if, v-else 等指令檢測
     */
    'plugin:vue/essential', // 額外添加的規(guī)則可查看 https://vuejs.github.io/eslint-plugin-vue/rules/
    /**
     * 「airbnb狂芋,愛彼迎」
     * 【】有兩種eslint規(guī)范,一種是自帶了react插件的「eslint-config-airbnb」憨栽,一種是基礎(chǔ)款「eslint-config-airbnb-base」,
     * 【】airbnb-base 包括了ES6的語法檢測翼虫,需要依賴 「eslint-plugin-import」
     * 【】所以在使用airbnb-base時屑柔,需要用npm額外下載 eslint-plugin-import
     * 【】所以eslint實際上已經(jīng)因為 airbnb-base 基礎(chǔ)配置項目,添加上了 eslint-plugin-import 插件配置
     * 【】所以在setting和rules里珍剑,都有 'import/xxx' 項目掸宛,這里修改的就是 eslint-plugin-import 配置
     */
    // 'airbnb-base',
  ],


  /**
   * 規(guī)則共享參數(shù)
   * http://eslint.cn/docs/user-guide/configuring#adding-shared-settings
   * 【】提供給具體規(guī)則項,每個參數(shù)值招拙,每個規(guī)則項都會被注入該變量唧瘾,但對應(yīng)規(guī)則而言,有沒有用别凤,就看各個規(guī)則的設(shè)置了饰序,就好比 parserOptions,解析器用不用它就不知道了规哪。這里只是提供這個方法
   * 【】不用懷疑求豫,經(jīng)源碼驗證,這就是傳遞給每個規(guī)則項的诉稍,會當做參數(shù)傳遞過去蝠嘉,但用不用,就是具體規(guī)則的事情
   */
  settings: {
    /**
     *
     * 注意杯巨,「import/resolver」并不是eslint規(guī)則項蚤告,與rules中的「import/extensions」不同。它不是規(guī)則項
     * 這里只是一個參數(shù)名服爷,叫「import/resolver」杜恰,會傳遞給每個規(guī)則項。
     * settings并沒有具體的書寫規(guī)則层扶,「import/」只是import模塊自己起的名字箫章,原則上,它直接命名為「resolver」也可以镜会,加上「import」只是為了更好地區(qū)分檬寂。不是強制設(shè)置的。
     * 因為「import」插件很多規(guī)則項都用的這個配置項戳表,所以并沒有通過rules設(shè)置桶至,而是通過settings共享
     * 具體使用方法可參考https://github.com/benmosher/eslint-plugin-import
     */
    'import/resolver': {
      /**
       * 這里傳入webpack并不是import插件能識別webpack昼伴,而且通過npm安裝了「eslint-import-resolver-webpack」,
       * 「import」插件通過「eslint-import-resolver-」+「webpack」找到該插件并使用镣屹,就能解析webpack配置項圃郊。使用里面的參數(shù)。
       * 主要是使用以下這些參數(shù)女蜈,共享給import規(guī)則持舆,讓其正確識別import路徑
       * extensions: ['.js', '.vue', '.json'],
       * alias: {
       *  'vue$': 'vue/dist/vue.esm.js',
       *  '@': resolve('src'),
       *  'static': resolve('static')
       * }
       */
      webpack: {
        config: 'build/webpack.base.conf.js'
      }
    }
  },

  /**
   * 針對特定文件的配置
   * 【】可以通過overrides對特定文件進行特定的eslint檢測
   * 【】特定文件的路徑書寫使用Glob格式,一個類似正則的路徑規(guī)則伪窖,可以匹配不同的文件
   * 【】配置幾乎與 ESLint 的其他配置相同逸寓。覆蓋塊可以包含常規(guī)配置中的除了 extends、overrides 和 root 之外的其他任何有效配置選項覆山,
   */
  // overrides: [
  //   {
  //     'files': ['bin/*.js', 'lib/*.js'],
  //     'excludedFiles': '*.test.js',
  //     'rules': {
  //       'quotes': [2, 'single']
  //     }
  //   }
  // ],

  /**
   * 自定義規(guī)則
   * http://eslint.cn/docs/user-guide/configuring#configuring-rules
   * 【】基本使用方式
   *  "off" 或者0 關(guān)閉規(guī)則
   *  "warn" 或者1 將規(guī)則打開為警告(不影響退出代碼)
   *  "error" 或者2 將規(guī)則打開為錯誤(觸發(fā)時退出代碼為1)
   *  如:'no-restricted-syntax': 0, // 表示關(guān)閉該規(guī)則
   * 【】如果某項規(guī)則竹伸,有額外的選項,可以通過數(shù)組進行傳遞簇宽,而數(shù)組的第一位必須是錯誤級別勋篓。如0,1,2
   *  如 'semi': ['error', 'never'], never就是額外的配置項
   */
  rules: {
    /**
     * 具體規(guī)則
     * 【】具體的規(guī)則太多,就不做介紹了魏割,有興趣的同學可以上eslint官網(wǎng)查
     * 【】注意 xxx/aaa 這些規(guī)則是 xxx 插件自定的規(guī)則譬嚣,在eslint官網(wǎng)是查不到的。需要到相應(yīng)的插件官網(wǎng)中查閱
     * 【】如 import/extensions见妒,這是「eslint-plugin-import」自定義的規(guī)則孤荣,需要到其官網(wǎng)查看 https://github.com/benmosher/eslint-plugin-import
     */
    /**
     * 邏輯錯誤及最佳實踐的規(guī)則
     */
    'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, // 打包時禁止debugger
    'no-console': process.env.NODE_ENV === 'production' ? 2 : 0, // 打包時禁止console
    'no-alert': process.env.NODE_ENV === 'production' ? 2 : 0, // 打包時禁止console
    "for-direction": 2, // 禁止for無限循環(huán)
    "no-compare-neg-zero": 2, // 禁止與-0進行比較
    'no-cond-assign': 2, // 禁止條件語句中出現(xiàn)賦值語句
    "no-control-regex": 2, // 在 ASCII 中,0-31 范圍內(nèi)的控制字符是特殊的须揣、不可見的字符盐股。這些字符很少被用在 JavaScript 字符串中,所以一個正則表達式如果包含這些字符的耻卡,很有可能一個錯誤疯汁。
    "no-dupe-args": 2, // 禁止在函數(shù)定義或表達中出現(xiàn)重名參數(shù)
    "no-dupe-keys": 2, // 禁止在對象字面量中出現(xiàn)重復(fù)的鍵
    "no-duplicate-case": 2, // 禁止重復(fù) case 標簽
    "no-empty": 2, // 禁止空塊語句
    "no-empty-character-class": 2, // 禁止在正則表達式中出現(xiàn)空字符集
    "no-ex-assign": 2, // 禁止對 catch 子句中的異常重新賦值。因為catch出來的都是錯誤信息卵酪,不需要重新賦值
    "no-extra-boolean-cast": 2, // 禁止不必要的布爾類型轉(zhuǎn)換幌蚊,如 !!true
    "no-extra-semi": 2, // 禁用不必要的分號
    "no-inner-declarations": 2, // ??? 禁止在嵌套的語句塊中出現(xiàn)變量
    "no-regex-spaces": 2, // 禁止正則表達式字面量中出現(xiàn)多個空格
    "no-obj-calls": 2, // 禁止將全局對象當作函數(shù)進行調(diào)用
    "no-prototype-builtins": 2, // ??? 禁止直接在對象實例上調(diào)用 Object.prototype 的一些方法。
    "no-template-curly-in-string": 2, // 禁止在常規(guī)字符串中出現(xiàn)模板字面量占位符語法
    "semi": [2, 'never'], // ??? 強制是否使用分號溃卡。
    "no-unexpected-multiline": 2, // 禁止使用令人困惑的多行表達式
    "no-unreachable": 2, // 禁止在 return溢豆、throw、continue 和 break 語句后出現(xiàn)不可達代碼
    "use-isnan": 2, // 要求調(diào)用 isNaN()檢查 NaN
    "no-unsafe-negation": 2, // 禁止對關(guān)系運算符的左操作數(shù)使用否定操作符
    "valid-jsdoc": 2, // 強制使用有效的 JSDoc 注釋
    "valid-typeof": 2, // 強制 typeof 表達式與有效的字符串進行比較
    "array-callback-return": 2, // 強制數(shù)組方法的回調(diào)函數(shù)中有 return 語句
    "block-scoped-var": 2, // 把 var 語句看作是在塊級作用域范圍之內(nèi)
    "complexity": [1, 6], // 添加復(fù)雜度
    "curly": 2, // ??? 要求遵循大括號約定
    "default-case": 1, // 要求 Switch 語句中有 Default 分支
    "dot-location": [2, 'property'], // 強制在點號之前換行
    "dot-notation": 2, // 點號和字面量瘸羡,優(yōu)先使用點號
    "eqeqeq": [2, 'smart'], // ??? 要求使用 === 和 !==
    "guard-for-in": 2, // ??? 需要約束 for-in
    "no-caller": 2, // 禁用 caller 或 callee
    "no-empty-function": 2, // 禁止出現(xiàn)空函數(shù)
    "no-empty-pattern": 2, // 禁止使用空解構(gòu)模式
    "no-eval": 2, // 禁用 eval()
    "no-global-assign": 2, // 禁止對原生對象或只讀的全局對象進行賦值
    "no-floating-decimal": 2, // ?? 禁止浮點小數(shù)
    "no-fallthrough": 2, // 禁止 case 語句落空
    "no-labels": 2, // 禁用標簽語句
    "no-extra-label": 2, // 禁用不必要的標簽
    "no-extra-bind": 2, // 禁止不必要的函數(shù)綁定
    "no-iterator": 2, // 禁用迭代器
    "no-lone-blocks": 2, // 禁用不必要的嵌套塊
    "no-loop-func": 2, // 禁止循環(huán)中存在函數(shù)
    "no-magic-numbers": [2, {
     "ignoreArrayIndexes": true,
     "ignore": [-1, 0, 1, 2],
    }], // 禁止使用魔術(shù)數(shù)字漩仙,魔術(shù)數(shù)字是在代碼中多次出現(xiàn)的沒有明確含義的數(shù)字。它最好由命名常量取代。
    "no-multi-spaces": 2, // 禁止出現(xiàn)多個空格
    "no-multi-str": 2, // 禁止多行字符串
    "no-new": 2, // 禁止在不保存實例的情況下使用new
    "no-new-func": 2, // 禁用Function構(gòu)造函數(shù)
    "no-new-wrappers": 2, // 禁止原始包裝實例
    "no-octal": 2, // 禁用八進制字面量
    "no-octal-escape": 2, // 禁止在字符串字面量中使用八進制轉(zhuǎn)義序列
    "no-param-reassign": 2, // ??? 禁止對函數(shù)參數(shù)再賦值
    "no-proto": 2, // 禁用__proto__队他,改用 getPrototypeOf 方法替代 __proto__卷仑。
    "no-redeclare": 2, // 禁止重新聲明變量
    "no-return-assign": 2, // 禁止在返回語句中賦值
    "no-return-await": 2, // 禁用不必要的 return await
    "no-script-url": 2, // 禁用 Script URL
    "no-self-assign": 2, // 禁止自身賦值
    "no-sequences": 2, // ??? 不允許使用逗號操作符
    "no-throw-literal": 2, // 限制可以被拋出的異常
    "no-unmodified-loop-condition": 2, // 禁用一成不變的循環(huán)條件
    "no-useless-call": 2, // 禁用不必要的 .call() 和 .apply()
    "no-useless-concat": 2, // 禁止沒有必要的字符拼接
    "no-useless-escape": 2, // 禁用不必要的轉(zhuǎn)義
    "no-useless-return": 2, // 禁止多余的 return 語句
    "no-void": 2, // 禁止使用void操作符
    "no-with": 2, // 禁用 with 語句
    "prefer-promise-reject-errors": 1, // ??? 要求使用 Error 對象作為 Promise 拒絕的原因
    "radix": 1, // 要求必須有基數(shù)
    "require-await": 2, // 禁止使用不帶 await 表達式的 async 函數(shù)
    "vars-on-top": 2, // 要求將變量聲明放在它們作用域的頂部
    "wrap-iife": [2, 'inside'], // 需要把立即執(zhí)行的函數(shù)包裹起來
    "strict": [2, 'global'], // 要求或禁止使用嚴格模式指令
    /**
     * 變量相關(guān)的規(guī)則
     */
    "init-declarations": 2, // ??? 強制或禁止變量聲明語句中初始化
    "no-delete-var": 2, // 禁止刪除變量
    "no-shadow": 2, // 禁止變量聲明覆蓋外層作用域的變量
    "no-shadow-restricted-names": 2, // 關(guān)鍵字不能被遮蔽
    "no-undef": 2, // 禁用未聲明的變量
    "no-unused-vars": 1, // ??? 禁止未使用過的變量
    "no-use-before-define": 2, // 禁止定義前使用
    // 代碼風格
    "array-bracket-newline": [2, 'consistent'], // 在數(shù)組開括號后和閉括號前強制換行
    "array-bracket-spacing": 2, // 強制在括號內(nèi)前后使用空格
    "array-element-newline": [2, { "multiline": true }], // ??? 強制數(shù)組元素間出現(xiàn)換行
    "block-spacing": 2, // 強制在代碼塊中開括號前和閉括號后有空格
    "brace-style": 2, // 大括號風格要求
    "camelcase": 2, // 要求使用駱駝拼寫法
    "comma-dangle": [2, 'always-multiline'], // 要求或禁止使用拖尾逗號
    "comma-spacing": 2, // 強制在逗號周圍使用空格
    "comma-style": 2, // 逗號風格
    "computed-property-spacing": 2, // 禁止或強制在計算屬性中使用空格
    "consistent-this": [2, 'self'], // ??? 要求一致的 This
    "eol-last": [1, 'always'], // ??? 要求或禁止文件末尾保留一行空行
    "func-call-spacing": 2, // 要求或禁止在函數(shù)標識符和其調(diào)用之間有空格
    "func-style": [2, 'declaration'], // ??? 強制 function 聲明或表達式的一致性
    "function-paren-newline": [1, 'multiline'], // 強制在函數(shù)括號內(nèi)使用一致的換行
    "indent": [2, 2], // 強制使用一致的縮進
    "jsx-quotes": 2, // 強制在 JSX 屬性中一致地使用雙引號或單引號
    "key-spacing": 2, // 強制在對象字面量的鍵和值之間使用一致的空格
    "keyword-spacing": 2, // 強制關(guān)鍵字周圍空格的一致性
    "linebreak-style": 2, // 強制使用一致的換行符風格,用\n麸折,不用\r\n
    "lines-around-comment": 2, // 強制注釋周圍有空行
    "lines-between-class-members": 2, // 要求在類成員之間出現(xiàn)空行
    "max-depth": 2, // 強制塊語句的最大可嵌套深度
    "max-len": [2, { // 強制行的最大長度
      "code": 100,
      "tabWidth": 4,
      "ignoreUrls": true,
      "ignoreTrailingComments": true,
      "ignoreTemplateLiterals": true,
    }], //
    "max-lines": [2, 1000], // ??? 強制文件的最大行數(shù)
    "max-nested-callbacks": [2, 5], // 強制回調(diào)函數(shù)最大嵌套深度
    "max-statements-per-line": 2, // 強制每一行中所允許的最大語句數(shù)量
    "multiline-comment-style": 1, // 強制對多行注釋使用特定風格
    "new-cap": 2, // 要求構(gòu)造函數(shù)首字母大寫
    "new-parens": 2, // 要求調(diào)用無參構(gòu)造函數(shù)時帶括號
    "newline-per-chained-call": 2, // 要求方法鏈中每個調(diào)用都有一個換行符
    "no-bitwise": 2, // 禁止使用按位操作符
    "no-inline-comments": 0, // ??? 禁止使用內(nèi)聯(lián)注釋
    "no-lonely-if": 2, // 禁止 if 語句作為唯一語句出現(xiàn)在 else 語句塊中
    "no-mixed-spaces-and-tabs": 2, // 禁止使用 空格 和 tab 混合縮進
    "no-multiple-empty-lines": 1, // ??? 不允許多個空行
    "no-negated-condition": 2, // 禁用否定表達式
    "no-nested-ternary": 2, // 禁止使用嵌套的三元表達式
    "no-new-object": 2, // 禁止使用 Object 構(gòu)造函數(shù)
    "no-trailing-spaces": 2, // 禁用行尾空白
    "no-underscore-dangle": 2, // 禁止標識符中有懸空下劃線
    "quotes": [2, 'single'], // 強制使用一致的單引號
    "quote-props": [2, 'as-needed'], // ??? 要求對象字面量屬性名稱使用引號
    "operator-linebreak": [2, 'before'], // 強制操作符使用一致的換行符風格
    "one-var": [2, 'never'], // ??? 強制函數(shù)中的變量在一起聲明或分開聲明
    "object-property-newline": 1, // ??? 強制將對象的屬性放在不同的行上
    "object-curly-spacing": [2, 'always'], // 強制在花括號中使用一致的空格
    "object-curly-newline": [1, { // ??? 對象屬性換行
      multiline: true,
    }], //
    "no-whitespace-before-property": 2, // 禁止屬性前有空白
    "no-unneeded-ternary": 2, // 禁止可以表達為更簡單結(jié)構(gòu)的三元操作符
    "semi-spacing": 2, // 強制分號前后有空格
    "semi-style": 2, // 分號風格
    "space-before-blocks": [2, 'always'], // 禁止語句塊之前的空格
    "space-before-function-paren": [2, 'never'], // 禁止函數(shù)圓括號之前有一個空格
    "space-in-parens": 2, // 禁止或強制圓括號內(nèi)的空格
    "space-infix-ops": 2, // 要求中綴操作符周圍有空格
    "space-unary-ops": 2, // 禁止在一元操作符之前或之后存在空格
    "spaced-comment": 2, // 要求在注釋前有空白
    "switch-colon-spacing": 2, // 強制在 switch 的冒號左右有空格
    "template-tag-spacing": 2, // 要求在模板標記和它們的字面量之間有空格
    /**
     * ES6相關(guān)規(guī)則
     */
    "arrow-parens": [2, 'as-needed'], // 要求箭頭函數(shù)的參數(shù)使用圓括號
    "arrow-body-style": 2, // 要求箭頭函數(shù)體使用大括號
    "arrow-spacing": 2, // 要求箭頭函數(shù)的箭頭之前或之后有空格
    "generator-star-spacing": 2, // ??? 強制 generator 函數(shù)中 * 號周圍有空格
    "no-class-assign": 2, // 不允許修改類聲明的變量
    "no-confusing-arrow": 2, // 禁止在可能與比較操作符相混淆的地方使用箭頭函數(shù)
    "no-const-assign": 2, // 不允許改變用const聲明的變量
    "no-dupe-class-members": 2, // 不允許類成員中有重復(fù)的名稱
    "no-duplicate-imports": 2, // 禁止重復(fù)導(dǎo)入
    "no-new-symbol": 0, // 禁止 Symbol 操作符和 new 一起使用lines-between
    "no-useless-computed-key": 2, // 禁止在對象中使用不必要的計算屬性
    "no-useless-constructor": 2, // 禁用不必要的構(gòu)造函數(shù)
    "no-useless-rename": 2, // 禁止在 import 和 export 和解構(gòu)賦值時將引用重命名為相同的名字
    "no-var": 2, // 要求使用 let 或 const 而不是 var
    "object-shorthand": 2, // 要求對象字面量簡寫語法
    "prefer-arrow-callback": 2, // 要求使用箭頭函數(shù)作為回調(diào)
    "prefer-const": 1, // ??? 建議使用const
    "prefer-destructuring": [2, { // 優(yōu)先使用數(shù)組和對象解構(gòu)
      "array": false,
      "object": true
    }],
    "prefer-rest-params": 2, // 使用剩余參數(shù)代替 arguments
    "prefer-spread": 2, // 建議使用擴展運算符而非.apply()
    "prefer-template": 2, // 建議使用模板而非字符串連接
    "require-yield": 2, // 禁用函數(shù)內(nèi)沒有yield的 generator 函數(shù)
    "rest-spread-spacing": 2, // 強制剩余和擴展運算符及其表達式之間有空格
    "template-curly-spacing": 2, // 強制模板字符串中空格的使用
    "sort-imports": [0, { // ??? import 排序 問題是要以字母排序
     "ignoreCase": true,
     "ignoreMemberSort": true,
     "memberSyntaxSortOrder": ['all', 'single', 'multiple', 'none']
    }], //
  }
};

如果有需要什么問題 可以留言討論N!9柑洹窜锯!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市芭析,隨后出現(xiàn)的幾起案子衬浑,更是在濱河造成了極大的恐慌,老刑警劉巖放刨,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異尸饺,居然都是意外死亡进统,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門浪听,熙熙樓的掌柜王于貴愁眉苦臉地迎上來螟碎,“玉大人,你說我怎么就攤上這事迹栓〉舴郑” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵克伊,是天一觀的道長酥郭。 經(jīng)常有香客問我,道長愿吹,這世上最難降的妖魔是什么不从? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮犁跪,結(jié)果婚禮上椿息,老公的妹妹穿的比我還像新娘。我一直安慰自己坷衍,他們只是感情好寝优,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枫耳,像睡著了一般乏矾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天妻熊,我揣著相機與錄音夸浅,去河邊找鬼。 笑死扔役,一個胖子當著我的面吹牛帆喇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播亿胸,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼坯钦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了侈玄?” 一聲冷哼從身側(cè)響起婉刀,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎序仙,沒想到半個月后突颊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡潘悼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年律秃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片治唤。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡棒动,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宾添,到底是詐尸還是另有隱情船惨,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布缕陕,位于F島的核電站粱锐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扛邑。R本人自食惡果不足惜卜范,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鹿榜。 院中可真熱鬧海雪,春花似錦、人聲如沸舱殿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沪袭。三九已至湾宙,卻和暖如春樟氢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侠鳄。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工埠啃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伟恶。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓碴开,卻偏偏與公主長得像,于是被迫代替她去往敵國和親博秫。 傳聞我的和親對象是個殘疾皇子潦牛,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容