[note] ESLint
keywords: CLI, linted
- Configuring ESLint @ ESLint > UserGuide > Configuring
 - Configuration Files @ ESLint > UserGuide > Configuration
 - ESLint Demo
 
v9 有 breaking change
ESLint v9 後的 API 有 breaking change,使用的是「flat configuration」,請在使用前先確認專案使用的 ESLint 版本。
Command Line Interface
$ npm init @eslint/config@latest
# npx eslint [options] [file|dir|glob]*
$ npx eslint yourfile.js
$ npx eslint file1.js file2.js
$ npx eslint "lib/**"
$ npx eslint  # 等同於 npx eslint .
# Debug
npx eslint --print-config file.js # 使用時機:當你不確定為什麼 linting 沒有產生預期的結果
npx eslint --inspect-config       # 使用時機:當你不確定某個檔案是否有套用到特定的 configuration object
ESLint Configuration
官方文件
// eslint.config.js
import exampleConfigs from 'eslint-config-example';
export default [
  {
    /**
     * Globally Ignore these files
     * 如果在 config object 中只使用 ignores 而沒有其他設定,
     * 那麼這些 patterns 將會被當作全域的 ignores
     */
    ignores: [
      'dist',
      'src/lib/api/schema.ts', // auto-generated by openapi-typescript
    ],
  },
  /**
   * Cascading Configuration Objects
   * 如果對於特定的檔案,有多個 config object 符合,
   * 那麼這些 config object 會被合併,
   * 當有衝突時後面的 object 會覆蓋前面的 object
   */
  {
    /**
     * files 用來指定這個 config object 要套用的檔案 pattern。
     * 如果這個 config object 沒有指定 files,
     * 則這個 config object 的設定會作用在所有其他 config object 中有設定的 files 上,
     * 類似 global configuration。
     */
    files: ['**/*.js'],
    linterOptions: {
      reportUnusedDisableDirectives: 'error',
    },
    /**
     * Configuring Shared Settings
     * settings 只會作用在這個 config object 上
     * 但這個 config object 中的所有 rules 都可以使用到這個 settings 的內容
     */
    settings: {
      react: { version: '18.3' },
    },
  },
  {
    /**
     * js.configs.recommended 的 config object 只會作用在符合 files pattern 的檔案上
     */
    ...js.configs.recommended,
    files: ['**/src/safe/*.js'],
  },
  /**
   * 如果 import 的是 array of config object,
   * 則可以用 array spread operator 把它展開
   * */
  ...exampleConfigs,
];
debug 神器
在 CLI 中帶入參數 --inspect-config 會額外開啟 config inspector,可以用來檢視不同的檔案套用到了哪些 Rules,非常方便。
Legacy (v8 以前)
Command Line Interface
Command Line Interface @ ESLint
# 安裝 eslint cli
$ npm i eslint
# 初始化 eslint 專案
$ npx eslint --init  # To check syntax, find problems, and enforce code style
# 執行 eslint
$ eslint [options] [file|dir|glob]*
# 留意: --ext 主要是針對資料夾使用,表示只要 lint 這個資料夾內的特定副檔名,
# 但如果給的是檔案路徑,則 "ext" 這個參數會被忽略,一定會 lint 到這個檔案
$ eslint . --ext .jsx,.js,.ts,.tsx --cache --quiet --report-unused-disable-directives
# 只檢查和 develop branch 相比有變更的檔案(origin/develop...HEAD)
# 且不要檢查被刪除的檔案(--diff-filtered=d)
$ npx eslint -c .eslintrc $(git diff --name-only --diff-filter=d develop...HEAD)
# 檢視並複製當前套用到的 eslint config
$ npx eslint --print-config path::String | pbcopy
使用範例
# eslint [options] file.js [file.js] [dir]
$ eslint 'src/**/*.ts'   # 檢驗所有 src 中的 .ts 檔
$ eslint file1.js file2.js
$ eslint lib/**
修復問題
# Fixing problems:
#  --fix              自動修復問題
#  --fix-dry-run      自動修復問題,但不儲存檔案
$ eslint 'src/**/*.ts' --fix
透過 npm 執行
// package.json
"scripts": {
  "lint": "eslint src/**/*.ts"
}
執行:
$ npm run lint -- --fix
設定 ESLint
ESLint Configuration @ ESLint