程式碼風格統一: 使用husky, prettier, eslint在程式碼提交時自動格式化,並檢查程式碼。

浪浪的柺子發表於2018-11-20

引言

這個需求主要是組內成員用的編輯器不統一,程式碼風格也各異,所以在修改程式碼時,如果格式化了程式碼,在code review階段很難分辨修改了的程式碼。當然,程式碼風格統一還有其他好處,這裡就不不多廢話了。

先看效果

原始檔

程式碼風格統一: 使用husky, prettier, eslint在程式碼提交時自動格式化,並檢查程式碼。
可以看到有很多紅線,這個是因為不符合prettier的規則,這種情況下會使用eslint進行報錯,就是你看到的紅線了。具體如何配置之後再講。下面來看看提交時的情況。

程式碼風格統一: 使用husky, prettier, eslint在程式碼提交時自動格式化,並檢查程式碼。
對比上圖,可以看到程式碼已經被格式化了。這時我們再改一改,去掉eslint報的錯誤。注意HelloWorld()後故意留個報錯,而且我們沒有加分號。

程式碼風格統一: 使用husky, prettier, eslint在程式碼提交時自動格式化,並檢查程式碼。
再次提交。

程式碼風格統一: 使用husky, prettier, eslint在程式碼提交時自動格式化,並檢查程式碼。
此時的程式碼變為

程式碼風格統一: 使用husky, prettier, eslint在程式碼提交時自動格式化,並檢查程式碼。
可以看到,之前HelloWorld()後的報錯沒有了,而且分號自動加上去了。這是用了eslint自動修復的功能。

總結下: 在我們提交程式碼時,先自動幫我們格式化程式碼,然後使用eslint檢查程式碼,並自動修復錯誤,在修復不了的時候,報錯給我們。並且報錯後此次的commit不會提交。

下面看如何配置。

使用的工具

  • husky。一個git鉤子工具,這裡主要用pre-commit鉤子。通俗點講就是husky可以在你commit之前幫你做一些事情。
  • prettier。 一個很流行的程式碼格式化工具,你很容易在編輯器找到實現它的各種外掛,像vscode,atom,webstom都可以找到。這裡用它在程式碼提交前做程式碼格式化。
  • eslint。 程式碼檢查工具。eslint也可以負責一部分程式碼格式檢查的工作,但是prettier已經做的很好了,所以我便沒用eslint的程式碼格式檢查,只讓其負責程式碼錯誤檢查。
  • lint-staged。在你提交的檔案中,執行自定義的指令。don’t let ? slip into your codebase. — lint-staged

安裝

安裝eslint

npm i -D eslint babel-eslint eslint-config-airbnb eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react
複製程式碼

安裝prettier

npm install --save-dev prettier eslint-plugin-prettier eslint-config-prettier
複製程式碼

安裝husky,lint-staged

npm i -D husky lint-staged pretty-quick
複製程式碼

prettier配置

  • prettier 程式碼格式化核心
  • eslint-plugin-prettier 外掛,可以讓eslint使用prettier規則進行檢查,並使用--fix選項。像之前的格式不對時,eslint提示的紅線。
  • eslint-config-prettier 外掛,之前說了eslint也會檢查程式碼的格式,這個外掛就是關閉所有不必要或可能跟prettier產生衝突的規則。

eslintrc.json新增如下配置:

{
 "extends": ["airbnb", "plugin:prettier/recommended"],
}
複製程式碼

這個配置做如下三件事:

  1. 使eslint-plugin-prettier生效
  2. 不符合prettier/prettier的規則,會報錯。就是之前截圖中的紅線。
  3. 使eslint-config-prettier生效。就是會覆蓋eslint中與prettier衝突的配置。

prettier配置檔案

prittier配置檔案支援很多種,具體可以看這裡。我使用的是.prettierrrc格式,因為試過其他格式,但是隻有.prettierrrc,vscode才可以識別。 生成配置可以直接用官網上的try it out,左下角有匯出配置。下面這份配置基本上是風格要求的全部了,具體可按照個人愛好進行配置。

{
  "printWidth": 120, // 一行最大多少字元
  "tabWidth": 2, // tab佔用的字元數
  "useTabs": false, // 是否使用tab代替空格
  "semi": true, // 是否每句後都加分號
  "singleQuote": true, // 是否使用單引號
  "jsxSingleQuote": false, // jsx是否使用單引號
  "trailingComma": "all", // 陣列尾逗號。
  "bracketSpacing": false, // {foo: xx}還是{ foo: xx }
  "jsxBracketSameLine": false, //看官網
  "arrowParens": "always" //剪頭函式引數是否使用()
}
複製程式碼

eslint配置

直接上配置:

{
  "extends": ["airbnb", "plugin:prettier/recommended"], // eslint擴充套件規則
  "parserOptions": {
    "ecmaVersion": 7,
    "sourceType": "module",
    "ecmaFeatures": {
      "jsx": true
    }
  },
  "parser": "babel-eslint",// 解決ES6 improt會報錯
  "env": { // eg如果不配置browser,window就會被eslint報undefined的錯
    "es6": true,
    "browser": true,
    "node": true
  },
  "plugins": ["react", "jsx-a11y", "import"],
  "rules": {
    "class-methods-use-this": 0,
    "import/no-named-as-default": 0,
    "react/jsx-filename-extension": [
      "error",
      {
        "extensions": [".js", ".jsx"]
      }
    ]
  }
}
複製程式碼

husky鉤子pre-commit配置

  "husky": {
    "hooks": {
      "pre-commit": "lint-staged" // pre-commit,提交前的鉤子
    }
  },
  "lint-staged": {
    // 此處可以配置資料夾和檔案型別的範圍
    "src/**/*.{jsx,txs,ts,js,json,css,md}": [
      "prettier --write", // 先使用prettier進行格式化
      "eslint --fix", // 再使用eslint進行自動修復
      "git add" // 所有通過的話執行git
    ]
  },
複製程式碼

husky會在你提交前,呼叫pre-commit鉤子,執行lint-staged,如果程式碼不符合prettier配置的規則,會進行格式化;然後再用eslint的規則進行檢查,如果有不符合規則且無法自動修復的,就會停止此次提交。如果都通過了就會講程式碼新增到stage,然後commit。

其他的坑

  1. 尾逗號 只有換行時才會有效果: trailingComma配置為 all
function HelloWorld({greeting = "hello", greeted = '"World"', silent = false, onMouseOver,}) {
	let noTrailingComma = [a , b,c]
}
複製程式碼

格式化後為

function HelloWorld({
  greeting = "hello",
  greeted = '"World"',
  silent = false,
  onMouseOver, // 這裡有逗號
}) {
  let noTrailingComma = [a, b, c]; // 注意這裡c後面沒有逗號
}

複製程式碼
  1. vscode配置 我的vscode預設使用的是全域性安裝的eslint,沒有使用專案本地的,所以要更新下全域性的eslint外掛版本。如果小夥伴知道如何配置的,跟我說下哈。

結尾

如果小夥伴有看不明白或者我寫的不清楚的,有問題的,歡迎指正~

相關文章