更新時間:2019-01-22
React.js create-react-app 項目 + VSCode 編輯器 + ESLint 代碼檢查工具 + Airbnb 編碼規範
前言
爲什麼要使用 ESLint
在項目開發過程中,編寫符合團隊編碼規範的代碼是尤爲重要的,程序首先是給人看的,其次纔是給機器去執行。我們在開發工作中,代碼維護會佔很大的比重,很多時候我們還需要閱讀他人的代碼,如果沒有一個統一的編碼規範,將會給我們的工作帶來很大的困擾。
因此,我們期望在開發過程中遵循統一的編碼規範,以實現避免基本語法錯誤、代碼格式化、規避一些不推薦的用法等目的,最大程度的保證代碼的可讀性和正確性。通常每個團隊都會制定適合自己的編碼規範和代碼風格,但是僅僅制定規範是不夠的,還需要藉助代碼檢查工具來強制推行團隊的編碼規範,比如 ESLint 代碼檢查工具。
本文會介紹一種 ESLint 的配置方案,但本文關於 ESLint 的配置是基於一定的開發環境的,偏重於實際應用,並非 ESLint 本身的介紹。這裏對 ESLint 的配置基於以下環境:
- React.js create-react-app 腳手架項目
- 使用 VSCode 編輯器
- 基於 Airbnb 編碼規範
相關鏈接
- ESLint 代碼檢查工具
ESLint 中文 是一個開源的 JavaScript 代碼檢查工具,由 Nicholas C. Zakas 於2013年6月創建。JavaScript 是一個動態的弱類型語言,在開發中比較容易出錯。因爲沒有編譯程序,爲了尋找 JavaScript 代碼錯誤通常需要在執行過程中不斷調試。像 ESLint 這樣的可以讓程序員在編碼的過程中發現問題而不是在執行的過程中。
ESLint 的初衷是爲了讓程序員可以創建自己的檢測規則。ESLint 的所有規則都被設計成可插入的。ESLint 的默認規則與其他的插件並沒有什麼區別,規則本身和測試可以依賴於同樣的模式。爲了便於人們使用,ESLint 內置了一些規則,當然,你可以在使用過程中自定義規則。
- Create-React-App 應用
Create React App 是 React 官方支持的創建單頁面 React 應用的方式,通過create-react-app
腳手架命令可以快速創建一個 React 應用,免去了我們自己配置 webpack 的麻煩,我們這次 ESLint 的配置方案就是基於create-react-app
項目的。 - VSCode 編輯器
VSCode 是微軟的良心之作,是一個輕量且強大的代碼編輯器,支持 Windows 和 Linux。內置 JavaScript、TypeScript 和 Node.js 支持,而且擁有豐富的插件生態系統,還可以通過安裝插件來支持 C++、C#、Python、PHP 等其他語言,堪稱開發的利器。插件擴展:Extensions for the Visual Studio family of products。 - Airbnb 編碼規範
Airbnb JavaScript Style Guide 是獨角獸公司 Airbnb 內部的 JavaScript 編碼規範,該項目是 Github 上很受歡迎的一個開源項目,在前端開發中使用廣泛,本文的 ESLint 配置規則就是以Airbnb JavaScript 編碼規範(2.0) 和 Airbnb React/JSX 編碼規範 作爲基礎的。
具體配置方法
在 VSCode 中安裝 ESLint 擴展
在 VSCode 擴展面板搜索 ESLint,找到安裝最多的那個安裝即可,安裝完成之後需要 重新加載
以激活擴展,但想要讓擴展進行工作,我們還需要進行 ESLint 的安裝配置。
創建 CRA 項目
我們的配置方案是基於 CRA 腳手架項目進行測試的,因此我們要先創建一個 CRA 項目,具體方法詳見官方文檔:Create React App。
創建的 CRA 項目文件組織結構如下:
my-app
├── README.md
├── node_modules
├── package.json
├── .gitignore
├── public
│ ├── favicon.ico
│ ├── index.html
│ └── manifest.json
└── src
├── App.css
├── App.js
├── App.test.js
├── index.css
├── index.js
├── logo.svg
└── serviceWorker.js
安裝 ESLint
ESLint 可以選擇進行本地安裝:
npm install eslint --save-dev
也可以進行全局安裝:
npm install -g eslint
一般推薦進行全局安裝,使其可以作用於我們所有的項目。具體請參見 eslint-npm 文檔。
創建 ESLint 配置文件
ESLint 安裝完成之後,我們需要創建一個配置文件,爲了詳細演示 ESLint 是如何在實際項目中工作的,我們接下來的操作都在我們上面已經創建的 CRA 腳手架項目中進行,且先不考慮 Airbnb 編碼規範的使用,而是先創建一個較爲常見的自定義代碼風格。
我們在創建的 my-app
項目下執行 cmd 命令 eslint --init
,根據提示我們選擇通過 Answer questions about your style
的方式創建一份自定義的代碼規範,下圖是一個示例,具體可根據項目需要進行配置:
這樣我們就已經創建了一個自定義的 ESLint 配置文件,可以看到在 my-app
項目中生成了一個名爲 .eslintrc.js
的文件,其中的規則就是根據我們上圖中的選擇進行設定的,具體內容如下:
/* .eslintrc.js */
module.exports = {
"env": {
"browser": true,
"commonjs": true,
"es6": true
},
"extends": "eslint:recommended",
"parserOptions": {
"ecmaFeatures": {
"jsx": true
},
"ecmaVersion": 2018,
"sourceType": "module"
},
"plugins": [
"react"
],
"rules": {
"indent": [
"error",
4
],
"linebreak-style": [
"error",
"windows"
],
"quotes": [
"error",
"single"
],
"semi": [
"error",
"always"
]
}
};
至此,我們在 VSCode 中打開 my-app
項目,可以發現 ESLint 擴展已經可以正常工作了,ESLint 會自動檢測語法錯誤,並高亮顯示,同時在 VSCode 編輯器的問題窗口會輸出相應的錯誤信息。
設置 autoFixOnSave
經過以上步驟操作之後,ESLint 擴展已經正常工作了,並且可以根據錯誤提示手動修復檢測到的錯誤,但是這樣顯然是低效和繁瑣的,這個時候就需要配置 ESLint 擴展插件的自動修復功能了。
在 VSCode 中依次點擊 文件-->首選項-->設置
,打開 settings.json
文件,在設置中搜索 eslint
,會發現 ESLint 擴展插件的自動修復功能是關閉的,我們在右側的用戶設置中對此項進行修改,將其設置爲:"eslint.autoFixOnSave": true,
,這樣 ESLint 擴展插件的自動修復功能就打開了。
此時,我們再次打開錯誤頁面,執行保存(Ctrl+s)操作,就會發現 eslint
的錯誤可以自動修復了,如果當前頁面錯誤較多的話,可能需要多次執行 Ctrl+s
。
使用 Airbnb 編碼規範
上面我們已經使 ESLint 在我們的項目中正常工作了,但使用的代碼風格是我們自定義的,有時候我們希望使用一些大廠的比較成熟的代碼規範,比如 Airbnb JavaScript Style
,接下來我們就將自定義的 ESLint 配置改爲使用 Airbnb 編碼規範配置。
首先,我們需要安裝 2 個 npm 依賴包:
-
babel-eslint,增強語法識別能力
babel-eslint allows you to lint ALL valid Babel code with the fantastic ESLint.
$ npm i babel-eslint
-
eslint-config-airbnb,Airbnb 提供的支持 ECMAScript 6+ 和 React 的 ESLint rules,包括
eslint
eslint-plugin-import
eslint-plugin-react
以及eslint-plugin-jsx-a11y
。Our default export contains all of our ESLint rules, including ECMAScript 6+ and React. It requires eslint, eslint-plugin-import, eslint-plugin-react, and eslint-plugin-jsx-a11y. If you don't need React, see eslint-config-airbnb-base.
// If using npm 5+, use this shortcut $ npx install-peerdeps --dev eslint-config-airbnb
然後我們要修改 .eslintrc.js
文件,以使用我們安裝的 Airbnb 編碼規範,修改後內容如下:
/* .eslintrc.js */
module.exports = {
"env": {
"browser": true,
"commonjs": true,
"es6": true
},
"extends": "airbnb", // 使用 eslint-config-airbnb
"parser": "babel-eslint", // 增強語法識別能力
"parserOptions": {
"ecmaFeatures": {
"jsx": true
},
"ecmaVersion": 2017,
"sourceType": "module"
},
"rules": {
// 這裏可以根據需要對 airbnb 的規則進行修改,此處僅爲示例
"linebreak-style": 0,
"prefer-destructuring": 0,
"prefer-const": 0,
"one-var": 0,
"comma-dangle": ['error', {
arrays: 'only-multiline',
objects: 'always-multiline',
imports: 'only-multiline',
exports: 'only-multiline',
functions: 'ignore',
}],
"no-console": 1,
"import/prefer-default-export": 0,
"import/no-extraneous-dependencies": [2, {'devDependencies': true}],
"react/prop-types": 1,
"react/forbid-prop-types": 0,
"react/jsx-filename-extension": [2, {extensions: ['.js', '.jsx', '.tsx']}],
"jsx-a11y/anchor-is-valid": 0,
// VSCode 的 ESLint 擴展插件暫時無法正確修復這條規則帶來的錯誤
"react/jsx-one-expression-per-line": 0,
}
};
至此,我們完成了在 React-CRA 應用中配合 VSCode 使用 ESLint 的全部配置。
錯誤信息
在修改 .eslintrc.js
文件以使用Airbnb 編碼規範(eslint-config-airbnb)的過程中,發現 VSCode 的 ESLint 擴展插件對其中的有些規則不能正確的自動修復,比如:
// One JSX Element Per Line
// https://github.com/yannickcr/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/jsx-one-expression-per-line.md
'react/jsx-one-expression-per-line': ['error', { allow: 'single-child' }],
查閱 eslint-config-airbnb 的文檔發現,eslint-config-airbnb v17.1.0
版本修改了上面這條規則,具體可以參見:re-enabling jsx-one-expression-per-line
allowing single children 以及 One JSX Element Per Line (react/jsx-one-expression-per-line)。
當前版本的 VSCode 的 ESLint 擴展插件無法正確修復這條規則帶來的錯誤,由於暫時找不到其他解決方法,這裏就先將這條規則關閉。
由此可見,隨着 VSCode 或 ESLint 相關的插件和依賴包版本的變動,配置也會發生一些不可預期的變化,這裏將用來測試的 CRA 腳手架項目的 package.json
文件內容附錄如下;
/* package.json */
{
"name": "my-app",
"version": "0.1.0",
"private": true,
"dependencies": {
"babel-eslint": "^10.0.1",
"react": "^16.7.0",
"react-dom": "^16.7.0",
"react-scripts": "2.1.3"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": "react-app"
},
"browserslist": [
">0.2%",
"not dead",
"not ie <= 11",
"not op_mini all"
],
"devDependencies": {
"eslint": "^5.3.0",
"eslint-config-airbnb": "^17.1.0",
"eslint-plugin-import": "^2.14.0",
"eslint-plugin-jsx-a11y": "^6.1.1",
"eslint-plugin-react": "^7.11.0"
}
}