代碼規範篇——各種lint

一、eslint

ESLint 是在 ECMAScript/JavaScript 代碼中識別和報告模式匹配的工具,它的目標是保證代碼的一致性和避免錯誤。這是官網地址 https://eslint.bootcss.com/docs/user-guide/getting-started

  • ESLint 使用 Espree 解析 JavaScript。
  • ESLint 使用 AST 去分析代碼中的模式
  • ESLint 是完全插件化的。每一個規則都是一個插件並且你可以在運行時添加更多的規則。

首先安裝一下 eslint 模塊

npm i eslint -D

再初始化 eslint 配置,執行 --init 命令會在項目根目錄下自動創建 .eslintrc.js 配置文件。期間會提供一些選項讓你選擇,你的模塊標準是 ES6 還是 CommonJs、項目中用的是 react 還是 vue 等,然後根據你的選擇豐富配置信息。當然你也可以手動創建

下面是默認生成的配置文件 .eslintrc.js

module.exports = {
    "env": {
        "browser": true,
        "commonjs": true,
        "es6": true
    },
    "extends": [
        "eslint:recommended",
        "plugin:react/recommended",
        'standard' // 這行是自己加的,代碼規範庫
    ],
    "globals": {
        "Atomics": "readonly",
        "SharedArrayBuffer": "readonly"
    },
    "parserOptions": {
        "ecmaFeatures": {
            "jsx": true
        },
        "ecmaVersion": 2018
    },
    "plugins": [
        "react"
    ],
    "rules": {
        // 可以自己定義一些規則
    }
};

1.1 編碼規範

應用了 ESLint 後,通常是需要自己來配置繁雜的 rules 規則,這也是一個喜好類的東西,多數人是不願意在這上面耗費太多精力的(比如手動配置數百個ESLint 規則),於是github 上出現了一些開源的代碼規範庫,比較流行的有 airbnb、standard、prettier等

1.2 使用

--ext 格式檢查

在 .eslintrc.js 同級目錄下執行  eslint src/ --ext .js,意思是檢查 src 目錄下所有的 js 文件內容規範,如果代碼風格不符合規範,給給出警告或者錯誤提示

--fix 自動修復

我們執行 --fix 命令,eslint 會按照我們定製的格式自動修復文件,然後我們再次執行格式檢查就不會有報錯了

結合 vscode,實現保存時自動修復格式,首先安裝一下ESLint 插件。

安裝好了之後默認設置已經可以實現保存時自動格式化了,如果不能,接着下面的設置

vscode 打開文件->首選項->設置,搜索 eslint

選中 Enable

打開 setting.json 文件

找到 source.fixAll.eslint 並設置爲 true,如此,當我們 ctrl + s 保存代碼時,就能實現代碼自動格式化

二、stylelint

2.1安裝

npm install -d -save-dev stylelint

安裝 stylint-config-standard 和 stylelint-order

npm install stylelint-config-standard stylelint-order --save-dev

其中,stylelint是運行工具,stylelint-config-standard是stylelint的推薦配置,stylelint-order是CSS屬性排序插件(先寫定位,再寫盒模型,再寫內容區樣式,最後寫 CSS3 相關屬性)。

2.2 使用

stylelint 配置文件可以寫成  .stylelintrc .stylelintrc.json , .stylelintrc.yaml , .stylelintrc.yml , .stylelintrc.js 都可以,爲了能和 .eslintrc.js 保持一致,我用的時 .stylelintrc.js。

module.exports = {
    processors: [],
    plugins: [],
    extends: "stylelint-config-standard", // 這是官方推薦的方式
    rules: {
      "at-rule-empty-line-before": "always"|"never",
      "at-rule-name-case": "lower"|"upper",
      "block-no-empty": true,
    }
};

 格式檢查

 --fix 自動修復

2.3 配合 vscode

首先安裝 stylelint 插件

三、prettier

eslint、stylelint 的關注點是語法檢查,它可以幫助你檢測出代碼中的潛在問題,提高代碼質量,甚至自動幫你修復問題(--fix)。但是並不能完全統一代碼風格。

而 prettier 專注於代碼風格,它能夠完全統一你和同事的代碼風格,提高代碼的可讀性。但是由於 eslint、stylelint 也會對代碼做一些格式化的操作,所以他們和 prettier 可能會出現一些衝突。它有一下幾個優點:

  • 代碼規範比 ESLint 的 Airbnb、Standard 更好更先進。
  •  比 ESLint 提供更少的代碼風格規則配置項,終極目的是結束關於代碼風格的爭論。
  • 比 ESLint 支持更多的語言

3.1 安裝

npm i -D prettier eslint-plugin-prettier

eslint-plugin-prettier插件會調用prettier對你的代碼風格進行檢查,其原理是先使用prettier對你的代碼進行格式化,然後與格式化之前的代碼進行對比,如果過出現了不一致,這個地方就會被prettier進行標記。 

3.2 使用

//.eslintrc.js
{
  "plugins": ["prettier"],
  "rules": {
    "prettier/prettier": "error"
  }
}

prettier 默認的風格不能滿足我們,我們也可以自己做一些個性化的配置。在根目錄新建 .prettierrc.js

module.exports = {
  "printWidth": 80, //一行的字符數,如果超過會進行換行,默認爲80
  "tabWidth": 2, //一個tab代表幾個空格數,默認爲80
  "useTabs": false, //是否使用tab進行縮進,默認爲false,表示用空格進行縮減
  "singleQuote": false, //字符串是否使用單引號,默認爲false,使用雙引號
  "semi": true, //行位是否使用分號,默認爲true
  "trailingComma": "none", //是否使用尾逗號,有三個可選值"<none|es5|all>"
  "bracketSpacing": true, //對象大括號直接是否有空格,默認爲true,效果:{ foo: bar }
  "parser": "babylon" //代碼的解析引擎,默認爲babylon,與babel相同。
}

四、commitlint

現在我們已經可以通過 eslint、stylelint 來檢查本地代碼是否存在潛在錯誤,通過 prettier 來規範代碼風格。但是團隊裏就是有個刺兒頭,他把 vscode 中這插件的功能都給關了。然後把不符合規範的代碼提交到遠程倉庫,然後你和其他同事把代碼下載下來,恨恨的說了一句 mmp。

既然刺兒頭不按規範了約束代碼,我就讓你不能提交。

4.1 git hooks

git 可以在特定的動作發生時觸發自定義腳本。這些鉤子都被放在 .git/hooks 文件夾下,文件名都是以 .simple 結尾。如果你想啓用它,那麼把這個文件名後綴去掉就行了。

我們來看一下 commit msg 規範怎麼做。下面的規範僅供參考(type: message)

  • feat:新功能(feature)
  • fix:修補bug
  • hotfix:緊急修復bug
  • test:增加測試
  • docs:文檔(documentation)
  • style: 格式(不影響代碼運行的變動)
  • refactor:重構(即不是新增功能,也不是修改bug的代碼變動)
  • chore:構建過程或輔助工具的變動

首先我們需要把 commit-msg 改爲 commit-msg.simple,這樣就啓用了這個鉤子

然後把內容改成這個樣子

#!/bin/bash
MSG=`awk '{printf("%s",$0)}' $1`
if [[ $MSG =~ ^(feat|fix|test|refactor|docs|style|chroe)\(.*\):.*$ ]]
then
	echo -e "\033[32m commit success! \033[0m"
else
    echo -e "\033[31m Error: the commit message is irregular \033[m"
	echo -e "\033[31m Error: type must be one of [feat,fix,docs,style,refactor,test,chore] \033[m"
    echo -e "\033[31m eg: feat(user): add the user login \033[m"
	exit 1
fi

這個時候我們在 commit 的時候,如果不符合規範,是無法提交的

只有符合規範的 message 纔可以提交

4.2 husky

husky能夠防止不規範代碼被commit、push、merge等等。

4.2.1 安裝

npm install husky --save-dev

 4.2.2 使用

在 package.json 中加入這麼一段配置

"husky": {
    "hooks": {
      "pre-commit": "eslint --ext .js,.vue src && git add ."
    }
 }

意思是在 commit 之前會先檢查 src 下的 js 和 vue 文件是否符合規範,如果不符合,那麼 commit 是不會成功的。如下

意思是我在 main.js 中定義了一個變量 Fingerprint,但是卻沒有使用它。現在我們把 main.s 中的這個沒用的變量給去掉

成功了,同理我們可以在 commit 之前加上對 css 的校驗。 

4.3 lint-staged

當我們在 pre-commit 中做很多事情的時候,上面那種寫法就比較蛋疼,會是老長老長的一串。這個時候我們就可以引入 lint-staged 來大理這些任務,具體配置如下

"husky": {
    "hooks": {
        "pre-commit": "lint-staged"
    }
    },
    "lint-staged": {
        "*.css": [
            "stylelint --fix",
            "prettier --write",
            "git add"
        ],
        "*.scss": [
            "stylelint --fix --syntax scss",
            "prettier --write",
            "git add"
        ],
        "*.{js,jsx}": [
            "eslint --fix",
            "git add"
    ]
},

如此,當我們在執行 commit 的時候,會先去執行 lint-staged 中的代碼。

  • 對 css 先進行語法檢查並修復,在格式化代碼風格,在 git add 到緩存中
  • 對 scss 同上
  • 對 js 同上

這樣任務看起來就清晰多了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章