隨着項目的不斷增長,急切須要統一每一個項目的代碼規範,將一些低級錯誤在萌芽狀態下掐死。因此特此結合當前項目使用的一些規範,再根據社區推薦的規範,整合成這個repo。裏面集成了React和Nodejs的編程規範,全部的規範都是基於airbnb,裏面細分了js版本和ts版本,知足你們的編程需求。javascript
另外其餘框架的代碼規範沒有實際項目經驗,因此沒能集齊全部」龍珠「,所以在此歡迎你們貢獻出平時使用的標準編碼規範(儘可能是基於airbnb的),共享給社區其餘童鞋。html
在說明Eslint配置以前,咱們先來掌握Eslint配置的生態圈中涉及到的一些依賴包的做用,這樣咱們方能夠知其因此然。java
babel-eslint: 該依賴包容許你使用一些實驗特性的時候,依然可以用上Eslint語法檢查。反過來講,當你代碼並無用到Eslint不支持的實驗特性的時候是不須要安裝此依賴包的。node
@typescript-eslint/parser: Typescript語法的解析器,相似於babel-eslint
解析器同樣。對應parserOptions
的配置參考官方的README。react
eslint-config-airbnb: 該包提供了全部的Airbnb的ESLint配置,做爲一種擴展的共享配置,你是能夠修改覆蓋掉某些不須要的配置的,該工具包包含了react的相關Eslint規則(eslint-plugin-react與eslint-plugin-jsx-a11y),因此安裝此依賴包的時候還須要安裝剛纔說起的兩個插件webpack
eslint-config-airbnb-base: 與上一個包的區別是,此依賴包不包含react的規則,通常用於服務端檢查。git
eslint-config-jest-enzyme: jest和enzyme專用的校驗規則,保證一些斷言語法可讓Eslint識別而不會發出警告。es6
eslint-config-prettier: 將會禁用掉全部那些非必須或者和prettier衝突的規則。這讓您可使用您最喜歡的shareable配置,而不讓它的風格選擇在使用Prettier時礙事。請注意該配置只是將規則off掉,因此它只有在和別的配置一塊兒使用的時候纔有意義。github
eslint-plugin-babel: 和babel-eslint一塊兒用的一款插件.babel-eslint在將eslint應用於Babel方面作得很好,可是它不能更改內置規則來支持實驗性特性。eslint-plugin-babel從新實現了有問題的規則,所以就不會誤報一些錯誤信息web
eslint-plugin-import: 該插件想要支持對ES2015+ (ES6+) import/export語法的校驗, 並防止一些文件路徑拼錯或者是導入名稱錯誤的狀況
eslint-plugin-jsx-a11y: 該依賴包專一於檢查JSX元素的可訪問性。
eslint-import-resolver-webpack: 能夠藉助webpack的配置來輔助eslint解析,最有用的就是alias,從而避免unresolved的錯誤
eslint-import-resolver-typescript:和eslint-import-resolver-webpack相似,主要是爲了解決alias的問題
eslint-plugin-react: React專用的校驗規則插件.
eslint-plugin-jest: Jest專用的Eslint規則校驗插件.
eslint-plugin-prettier: 該插件輔助Eslint能夠平滑地與Prettier一塊兒協做,並將Prettier的解析做爲Eslint的一部分,在最後的輸出能夠給出修改意見。這樣當Prettier格式化代碼的時候,依然可以遵循咱們的Eslint規則。若是你禁用掉了全部和代碼格式化相關的Eslint規則的話,該插件能夠更好得工做。因此你可使用eslint-config-prettier禁用掉全部的格式化相關的規則(若是其餘有效的Eslint規則與prettier在代碼如何格式化的問題上不一致的時候,報錯是在所不免的了)
@typescript-eslint/eslint-plugin:Typescript輔助Eslint的插件。
eslint-plugin-promise:promise規範寫法檢查插件,附帶了一些校驗規則。
husky: git命令hook專用配置.
lint-staged: 能夠定製在特定的git階段執行特定的命令。
Prettier相關的包有好多個,除了上面列舉的兩個,你可能還會用到下面的三個:
prettier-eslint:輸入代碼,執行prettier後再eslint --fix輸出格式化後的代碼。僅支持字符串輸入。
prettier-eslint-cli:顧名思義,支持CLI命令執行prettier-eslint的操做
那麼Prettier這麼多工具包,都是些什麼關係呢?太容易讓人混淆了。這裏用一段話簡單介紹一下:
最基礎的是prettier,而後你須要用eslint-config-prettier去禁用掉全部和prettier衝突的規則,這樣纔可使用eslint-plugin-prettier去以符合eslint規則的方式格式化代碼並提示對應的修改建議。爲了讓prettier和eslint結合起來,因此就誕生了prettier-eslint這個工具,可是它只支持輸入代碼字符串,不支持讀取文件,所以又有了prettier-eslint-cli
這就是5個工具包互相之間的關係。加上prettier以後的提示可讀性高一點,以下圖:
env: 預約義那些環境須要用到的全局變量,可用的參數是:es6
、broswer
、node
等。
es6
會使能全部的ECMAScript6的特性除了模塊(這個功能在設置ecmaVersion版本爲6的時候會自動設置)
browser
會添加全部的瀏覽器變量好比Windows
node
會添加全部的全局變量好比global
更多環境配置參考Specifying Environments
extends: 指定擴展的配置,配置支持遞歸擴展,支持規則的覆蓋和聚合。
plugins: 配置那些咱們想要Linting規則的插件。
parser: 默認ESlint使用Espree做爲解析器,可是一旦咱們使用babel的話,咱們須要用babel-eslint。
parserOptions: 當咱們將默認的解析器從Espree改成babel-eslint的時候,咱們須要指定parseOptions,這個是必須的。
ecmaVersion: 默認值是5,能夠設置爲三、五、六、七、八、九、10,用來指定使用哪個ECMAScript版本的語法。也能夠設置基於年份的JS標準,好比2015(ECMA 6)
sourceType: 若是你的代碼是ECMAScript 模塊寫的,該字段配置爲module
,不然爲script
(默認值)
ecmaFeatures:該對象指示你想使用的額外的語言特性
globalReturn:容許全局範圍內的`return`語句
impliedStrict:使能全局`strict`模式
jsx:使能JSX
複製代碼
rules: 自定義規則,能夠覆蓋掉extends的配置。
settings:該字段定義的數據能夠在全部的插件中共享。這樣每條規則執行的時候均可以訪問這裏面定義的數據
更多配置選項參考官方文檔Eslint
介紹了這麼多,咱們以模板提供的一個配置例子eslint-react-js來講(說明都寫在註釋裏了~):
module.exports = {
parser: 'babel-eslint', // Specifies the ESLint parser
parserOptions: {
ecmaVersion: 2015, // specify the version of ECMAScript syntax you want to use: 2015 => (ES6)
sourceType: 'module', // Allows for the use of imports
ecmaFeatures: {
jsx: true, // enable JSX
impliedStrict: true // enable global strict mode
}
},
extends: [
'airbnb', // Uses airbnb, it including the react rule(eslint-plugin-react/eslint-plugin-jsx-a11y)
'plugin:promise/recommended',
// 'prettier', // Use prettier, it can disable all rules which conflict with prettier
// 'prettier/react' // Use prettier/react to pretty react syntax
],
settings: {
'import/resolver': { // This config is used by eslint-import-resolver-webpack
webpack: {
config: './webpack/webpack-common-config.js'
}
},
},
env: {
browser: true // enable all browser global variables
},
'plugins': ['react-hooks', 'promise'], // ['prettier', 'react-hooks']
rules: {
// Place to specify ESLint rules. Can be used to overwrite rules specified from the extended configs
// e.g. '@typescript-eslint/explicit-function-return-type': 'off',
"react-hooks/rules-of-hooks": "error",
"semi": ["error", "never"],
"react/jsx-one-expression-per-line": 0,
/** * @description rules of eslint-plugin-prettier */
// 'prettier/prettier': [
// 'error', {
// 'singleQuote': true,
// 'semi': false
// }
// ]
},
};
複製代碼
由於咱們在代碼的保存以及提交階段都會進行prettier的格式化,因此在Eslint中禁用掉了全部跟prettier的配置,若是你須要的話,能夠從新enable掉。
下面對比一下打開prettier和沒有打開prettier的區別:
和
上面prettier介紹了那麼多,那麼這小節簡單介紹如下prettier的一些重要的的規則:
更多規則請參考:Options
安裝Eslint插件
Vscode配置:
2.1. editor.formatOnSave
置爲false,以防默認的文件格式化配置和Eslint和Prettier衝突
2.2. eslint.autoFixOnSave
置爲true,這樣當咱們每次保存文件的時候就能夠自動fix文件的錯誤格式。
以下圖:
Lint-staged幫助你在暫存文件的時候可以讓錯誤格式代碼不會提交到你分支。
由於提交代碼前的檢查是最後一個管控代碼質量的一個環節,因此在提交代碼以前進行lint檢查意義重大。這樣能夠確保沒有錯誤的語法和代碼樣式被提交到倉庫上。可是在整個項目上執行Lint進程會很低效,因此最好的作法就是檢查那個被改動的文件。而Lint-staged就是作這個的。
根據上面咱們提供的生態圈依賴包,在package.json
中配置該字段:
"lint-staged": {
"**/*.{tsx,ts}": [ // 這裏的文件後綴能夠修改爲本身須要的文件後綴
"prettier-eslint --write",
"git add"
]
}
複製代碼
爲了讓lint-staged能夠在change被staged以前執行,咱們這時候須要藉助git的鉤子功能,而提供鉤子功能的社區解決方案就是husky,該工具提供了git在多個階段前執行的操做,好比咱們此次要在預提交的時候進行Lint檢查,配置以下:
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
}
複製代碼
這樣每次commit的時候會執行lint操做,如以前所說,prettier-eslint-cli會將代碼prettier一遍後再eslint --fix,若是沒有錯誤,那麼就會直接執行git add
,不然報錯退出。
由於並非全部的人都使用VS code,因此爲了在一樣的項目下保持一致,好比tab的寬度或者行尾要不要有分號,咱們可使用.editorconfig來統一這些配置。
支持EditorConfig的編輯器列表請走這裏。
下面是模板配置裏面推薦的editorconfig的配置
# EditorConfig is awesome: http://EditorConfig.org
# top-most EditorConfig file
root = true
[*.md]
trim_trailing_whitespace = false
[*.js]
trim_trailing_whitespace = true
# Unix-style newlines with a newline ending every file
[*]
indent_style = space
indent_size = 2
# 保證在任何操做系統上都有統一的行尾結束字符
end_of_line = lf
charset = utf-8
insert_final_newline = true
max_line_length = 100
複製代碼
至此Eslint的全解析就完美落幕了,最後再安利一波eslint-config-templates,也歡迎你們PR。