eslint 是什麼
ESLint 是在 ECMAScript/JavaScript 代碼中識别和報告模式比對的工具,它的目标是保證代碼的一緻性和避免錯誤。在許多方面,它和 JSLint、JSHint 相似,除了少數的例外:
- ESLint 使用 Espree 解析 JavaScript。
- ESLint 使用 AST 去分析代碼中的模式
- ESLint 是完全插件化的。每一個規則都是一個插件并且可以在運作時添加更多的規則。
安裝
npm install eslint --save-dev
eslint + webpack + babel
安裝 loader
npm install eslint-loader --save-dev
配置webpack
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: ["babel-loader", "eslint-loader"]
},
....
]
},
eslint 配置 建立.eslintrc 檔案
{
"rules": {}
}
重新開機後,遇到解析錯誤,例如“保留關鍵字'import'或保留'關鍵字'export”。發生錯誤是因為ESLint尚不知道啟用Babel的JavaScript功能。例如,導入或導出語句是JavaScript ES6功能。是以,您必須使用babel-eslint節點程式包來整理有效的Babel解釋JavaScript的源代碼。從項目的根目錄中鍵入。
npm install babel-eslint --save-dev
然後,在.eslintrc配置檔案中,将babel-eslint添加為解析器:
{
"parser": "babel-eslint", // 解析器
"rules": {}
}
現在重新開機,還沒有配置規則,不會報任何錯誤
eslint 規則
{
...
"rules": {
"max-len": [1, 70, 2, {ignoreComments: true}] // 檢查行代碼字元不能超過 70 個字元
}
...
}
現在,為每個JavaScript項目提出一套ESLint規則将非常麻煩。這就是為什麼可以将它們共享為庫(節點程式包)的原因。有多種可共享的ESLint配置,但是,最受歡迎的一種是基于Airbnb樣式指南的Airbnb ESLint配置。除了項目的所有對等依賴項之外,還可以從項目的根目錄中的指令行中使用以下指令來安裝配置:
npm install eslint-config-airbnb --save-dev
控制台報了錯,解決控制台錯誤 Failed to load plugin 'jsx-a11y' declared in '.eslintrc » eslint-config-airbnb »
npm install eslint --save-dev
npm install eslint-plugin-jsx-a11y --save-dev
Failed to load plugin 'react' declared in '.eslintrc » eslint-config-airbnb »
npm install eslint-plugin-react --save-dev
{
"parser": "babel-eslint",
"extends": [
"airbnb"
],
"plugins": [
"jsx-a11y",
"react"
],
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module",
"ecmaFeatures": {
"jsx": true
}
},
"rules": {
"react/jsx-uses-react": "error",
"react/jsx-uses-vars": "error"
}
}
Failed to load plugin 'import' declared in '.eslintrc » eslint-config-airbnb
npm install eslint-plugin-import --save-dev
預設情況下,所有規則都是關閉的。
"rules": {
"react/jsx-uses-react": "error",
"react/jsx-uses-vars": "error",
"import/imports-first": 0,
"import/newline-after-import": 0,
"import/no-dynamic-require": 0,
"import/no-extraneous-dependencies": 0,
"import/no-named-as-default": 0,
"import/no-unresolved": 2,
"import/no-webpack-loader-syntax": 0,
"import/prefer-default-export": 0
}
'document' is not defined
"env": {
"browser": true,
"node": true
},
JSX not allowed in files with extension '.js'
修改 webpack 配置
resolve: {
extensions: ['.js', '.jsx', '.react.js'],
},
添加 eslint 配置 規則
"react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }],
Prettier + ESLint
Prettier用于自動格式化我的代碼以強制采用強制性的代碼格式,而ESLint確定代碼樣式保持良好狀态。
Prettier負責代碼格式設定,而ESLint負責代碼風格。前者會自動完成所有操作。如果設定了Prettier,則可以對其進行配置,以在儲存檔案時格式化檔案。這樣,再也不必擔心代碼格式了。由于Prettier的意見很高,是以隻能進行較小的配置。後者ESLint并不是要自動執行代碼樣式修複。相反,ESLint會警告您有關代碼氣味的資訊。例如,您可能會從另一個檔案導入某些内容,但是卻沒有利用目前檔案中導入的内容。 ESLint将警告您有關未使用的導入。與Prettier相比,ESLint具有很高的可配置性,因為它沒有預配置的規則。安裝完ESLint之後,您可以自行配置它,也可以使用幾種預配置的ESLint配置之一(例如Airbnb樣式指南)來獲得自覺的代碼樣式,而無需自己考慮好的代碼樣式。
安裝Prettier
npm install prettier --save-dev
安裝eslint-config-prettier eslint-plugin-prettier,負責組合Prettier和ESLint
pm install --save-dev eslint-config-prettier eslint-plugin-prettier
eslint-config-prettier:關閉了可能與Prettier沖突的所有ESLint規則
eslint-plugin-prettier:Prettier規則內建到ESLint規則中。
添加配置
{
"extends": ["prettier"],
"plugins": ["prettier"],
"rules": {
"prettier/prettier": ["error"]
},
}
如果需要從ESLint規則中排除檔案夾/檔案,則可以将其添加到.eslintignore檔案中(例如node_modules /)。
{
"printWidth": 100,
"tabWidth": 4,
"useTabs": false,
"semi": true,
"singleQuote": true,
"trailingComma": "all",
"bracketSpacing": true,
"jsxBracketSameLine": false,
"arrowParens": "always"
}
eslint最終配置
{
"parser": "babel-eslint",
"extends": [
"airbnb",
"prettier"
],
"plugins": [
"jsx-a11y",
"react",
"prettier"
],
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module",
"ecmaFeatures": {
"jsx": true
}
},
"env": {
"browser": true,
"node": true
},
"rules": {
"prettier/prettier": ["error"],
"react/jsx-uses-react": "error", //防止react被錯誤地标記為未使用
"react/jsx-uses-vars": "error",
"react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }],
"react/jsx-key": 2, //在數組或疊代器中驗證JSX具有key屬性
"import/no-dynamic-require": 0,
"import/no-extraneous-dependencies": 0,
"import/no-named-as-default": 0,
"import/no-unresolved": 2,
"import/no-webpack-loader-syntax": 0,
"import/prefer-default-export": 0,
"arrow-body-style": [2, "as-needed"], // 箭頭函數
"class-methods-use-this": 0, // 強制類方法使用 this
// 縮進Indent with 4 spaces
"indent": ["error", 4],
// Indent JSX with 4 spaces
"react/jsx-indent": ["error", 4],
// Indent props with 4 spaces
"react/jsx-indent-props": ["error", 4],
"no-console": 0, // 不禁用console
"no-debugger": 2 //禁用debugger
}
}