# Eslint 用來幫你檢查 js 語法的好夥伴。 在官方基礎教學 [Getting Started 的 Quick start 章節](https://eslint.org/docs/latest/use/getting-started#quick-start) 裡面有介紹最簡單的用法,使用 npm 下載後,對某個檔案/目錄使用 eslint 開始檢查: ```shell > npx eslint yourfile.js ``` 在 [Configuration 章節](https://eslint.org/docs/latest/use/getting-started#configuration) 則是說明當你用 npm 初始化 Eslint 後會生成他的 config 檔 `eslint.config.js`,而這個 config 檔的內容,官方在 [這個章節做了全面詳細介紹](https://eslint.org/docs/latest/use/configure/configuration-files#configuration-file)。 :::info 有興趣的可以逛逛 ==Eslint== 的 Reference。 ::: # Eslint & Vite & React 在 `Vite` 官網中,[Getting Started 的 Scaffolding Your First Vite Project 章節](https://vitejs.dev/guide/#scaffolding-your-first-vite-project),有說明可以使用一些預設模板可以使用,像是 react 的: ```shell > npm create vite@latest <your app name> -- --template react ``` 當你 create 好後,終端機也會指示你請執行 `npm init` 指令來初始化,此時你會看到你的 app 目錄就會多了很多種 config 檔,==當中也包含 Eslint 的 `eslint.config.js`==。 但是要注意一件事,在 `vite.config.js` 中==並沒有在 plugins 參數內代入 eslint==: ```js import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], }) ``` 如果你的 VSCode 也並沒有下載 Eslint 的 Extension,你在這個情況出了任何你沒有發現的錯誤,是沒有人會提醒你的:);因此如果正在使用 `npm run dev` 執行開發模式,HMR(Hot Module Replacement)也不會出任何問題,頂多就是有東西沒有正常運作,例如整個畫面消失只剩 css 的作用。 想要讓 Eslint 發揮作用的話,唯一需要做的就是下載 `vite-plugin-eslint` 然後在 `vite.config.js` import 他,代入到 plugins 裡面: ```bash > npm install -D vite-plugin-eslint ``` ```js import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import eslint from 'vite-plugin-eslint'; // https://vitejs.dev/config/ export default defineConfig({ plugins: [ react(), eslint() ], }) ``` 這樣 vite 就會知道有這個 plugin,`eslint.config.js` 才會發揮作用,HMR 時也就會幫你檢查了。 >所以我說 vite 官方你們為啥沒有放:_\) :::info - 這部分可以參考 [vite-plugin-eslint 的 github](https://github.com/gxmari007/vite-plugin-eslint) - 如果有安裝 Eslint 的 VSCode Extension,就會跟你在寫其他語言時一樣,在 IDE 中顯示哪邊有錯誤的紅底波浪線了:) ::: # `eslint.config.js` 下面介紹 `eslint.config.js` 裡面寫了什麼,而各個參數的詳細用途請參考這個 [上面提到的官方文檔](https://eslint.org/docs/latest/use/configure/configuration-files#configuration-file)。 ```js= import js from '@eslint/js' import globals from 'globals' import react from 'eslint-plugin-react' import reactHooks from 'eslint-plugin-react-hooks' import reactRefresh from 'eslint-plugin-react-refresh' export default [ { ignores: ['dist'] }, { files: ['**/*.{js,jsx}'], languageOptions: { ecmaVersion: 2020, globals: globals.browser, parserOptions: { ecmaVersion: 'latest', ecmaFeatures: { jsx: true }, sourceType: 'module', }, }, settings: { react: { version: '18.3' } }, plugins: { react, 'react-hooks': reactHooks, 'react-refresh': reactRefresh, }, rules: { ...js.configs.recommended.rules, ...react.configs.recommended.rules, ...react.configs['jsx-runtime'].rules, ...reactHooks.configs.recommended.rules, 'react/jsx-no-target-blank': 'off', 'react-refresh/only-export-components': [ 'warn', { allowConstantExport: true }, ], }, }, ] ``` - `ignores`:決定哪些檔案或目錄不用檢查。 - `file`:跟 `ignores` 相反。 - `languageOptions`:javascript 語言的各種選項。 - `plugins`:第三方 ==額外的 rules==。 - 22 跟 23 行是兩種命名的方式 - 22 行是說明有 ==react== 這個 plugin 物件 - 23 行是用 ==react-hooks== 這個字串代表 ==reactHooks== 這個 plugin - 23 跟 24 行的用法好處是可以指定特定的 rules - 詳情盡在 [官方的 plugins 文檔](https://eslint.org/docs/latest/use/configure/plugins) - `rules`:用來檢查程式碼的規則,詳情盡在 [官方的 rules 文檔](https://eslint.org/docs/latest/use/configure/rules) - 在第 27 行看到的就是==用於原始 js 語法的規則==,並且套用的是 ==recommended== 的規則。 - `...` 是展開運算符,他會將 `js.configs.recommended.rules` 這個物件 ==展開== - 由於我們用了 react 框架,所以也會需要 ==react 框架的規則== - 像是 28 ~ 35 行全都是用來檢查 react 語法的規則 - 32 行就是使用特定名稱的指定指令的寫法 :::info - 其實 29 跟 31 行的用途是覆蓋掉 28 行的 ==react.configs.recommended.rules== 的某幾條,將他的值從 ==2 / error== 改成 ==0 / off== ::: ## `no-unused-vars` 由於上面的規則中我們有包含 `js.configs.recommended.rules` ,其中就包含了: ```js { "rules": { "no-unused-vars": ["error", { "vars": "all", "args": "after-used", "caughtErrors": "all", "ignoreRestSiblings": false, "reportUsedIgnorePattern": false }] } } ``` 顧名思義,就是不可以有沒有使用的變數,但是由於寫 Code 過程中,如果一直讓他報錯會很麻煩,所以可以暫時先將他關掉,也就是修改 `eslint.config.js` 中的 `rules`,多加一條: ```js rules: { ...js.configs.recommended.rules, "no-unused-vars":"off", ...react.configs.recommended.rules, ...... }, ``` 這樣就可以把這條規則 ==關掉了==。 :::info - 要注意,你想要覆蓋的規則一定要放在第一次引入那行的下面,所以上面我們才會將 `"no-unused-vars":"off"` 放在 `...js.configs.recommended.rules` 的下面。 - 上面 info 提到的覆蓋也是同個道理 - `"no-unused-vars"` 的詳情可以參考 [這篇](https://eslint.org/docs/latest/rules/no-unused-vars)。 ::: ## `react/prop-types` 請參見 [這篇 stackoverflow](https://stackoverflow.com/questions/38684925/react-eslint-error-missing-in-props-validation)。