用魔法打敗魔法:前端代碼規范化


目錄

  1. 工具簡介
  2. 實現思路
  3. 具體實現
  4. 總結
  5. 附錄

代碼千萬行,規范第一行。
編碼不規范,同事兩行淚。

早幾年接手過一個項目,一堆bug不說,代碼還又臭又長,據說之前寫代碼的那位仁兄經常改一個bug又帶出十個bug🌝項目里充斥着各種含義不明的變量、沒有用到的不知道從哪里復制粘貼過來的函數、亂七八糟的console、隨心所欲的空行和毫無意義的注釋……

很多程序員沒有代碼規范意識,經常覺得只要功能能用就行了,代碼規范浪費時間,於是寫出來的代碼過一段時間可能連自己都看不懂是坨什么東西,更不用說接手的同事了。

今日便來說說,如何從技術層面,實現代碼規范以及代碼提交規范

1、工具簡介

  1. husky:一個Git hooks工具,可以讓我們在git提交前后進行一些操作,比如,在提交之前檢查代碼是否規范、進行統一的格式化處理、檢查git提交的信息格式等等;
  2. eslint:一個用NodeJS寫的Javascript代碼檢查工具,可自定義規則;
  3. lint-staged:一個能夠只對git變更文件進行代碼檢查的工具;
  4. commitizen:一個提供了交互式命令,可用於規范git commit信息的工具。

以上就是我們這次要用到的四個工具。

2、實現思路

我們可以通過husky提供的鈎子(hooks):

  • 在git提交前,使用eslint或者lint-staged對代碼進行檢查,並進行統一的格式化處理;

  • 在git提交時,檢查git commit的格式是否符合規定;同時,使用commitizen實現命令行交互,來輔助我們生成合規的git commit。

3、具體實現

3.1 husky

安裝:

yarn add husky -D

package.json

package.jsonscript中添加:

"scripts": {
  "prepare": "husky install"
}

preparenpm的生命周期腳本。

當執行npm install的時候,就會自動執行腳本內容husky install,從而在當前項目的根目錄下生成.husky文件夾。

.husky

這里的husky.sh配置主要是為了獲取hook的執行結果,當執行過程中出錯時,就退出進程。

接下來就可以愉快地使用git hooks啦。

3.2 hook:pre-commit

命令行執行yarn husky add .husky/pre-commit生成pre-commit腳本(當然也可以手動):

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

undefined

稍作修改,來驗證下在git commit的時候是否執行了這個腳本:

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

echo "commit之前執行"

命令行git提交代碼:

git add .
git commit -m”add husky config”

pre-commit執行結果

可以看到pre-commit腳本執行成功,打印出了語句。

3.3 在pre-commit里添加eslint檢查

安裝:

yarn add eslint —dev

安裝完成后,執行

yarn run eslint —init

./node_modules/.bin/eslint —init

這里我選擇的是airbnb的代碼規范

執行完成后會自動在根目錄生成eslint配置文件.eslinttrc.js

修改pre-commit,添加eslint格式檢查:

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"


echo "eslint格式校驗" && ./node_modules/.bin/eslint src/*

eslint檢查結果

可以看到,eslint檢測出代碼里有2個error和1個warning

error是必須修改的,可以使用eslint --fix自動修復,並執行git add .把fix后的變更也添加到git緩存區:

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

echo "eslint格式校驗"

./node_modules/.bin/eslint src/* --fix # 對src下的所有文件作eslint檢查,並用--fix修復error

git add . # 將eslint的fix內容也添加到git提交中

測試一下:

eslint修復了error並提交成功

成功!

提示:如果使用的是Github Desktop這類的圖形工具,有可能會出現下面這個錯誤——

這是因為我們只在項目里安裝了eslint,當在軟件上運行的時候就有可能出現路徑錯誤,只需要全局安裝一下eslint就可以了:

yarn add eslint -g

上面的eslint檢查腳本會對src中的所有文件進行檢查。如果是一個新項目還好,如果是一些老項目,那么涉及到的變更文件就會很多。

如果不想每次都全量檢測,那么可以通過git diff來獲取到變更的文件:

修改pre-commit:

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

echo "eslint格式校驗"

arr=`git diff --name-only  HEAD` # 查看變更文件
for filepath in ${arr[@]}
do
    if [[ "$filepath" =~ ^[src/] ]]; then : # 只檢測src下被修改的文件的格式
        if [ -f "$filepath" ];then # 只對存在的文件進行fix,跳過delete的文件
            echo $filepath
            ./node_modules/.bin/eslint $filepath --fix
            git add $filepath
        fi
    fi
done

這段代碼實現了:只對src中有變更且非刪除的文件進行eslint檢查和fix。

這里推薦一個工具,也就是上面提到的lint-staged,也能實現同樣的功能,使用起來更簡單

執行npx mrm@2 lint-staged,可以看到package.json中多了關於lint-staged的配置:

package.json

修改一下:

"lint-staged": {
    "src/*": "eslint --fix"
}

pre-commit改為:

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

echo "eslint格式校驗"

npx lint-staged

測試一下:

lint-staged代碼檢查

成功!

至此,我們就實現了基本的代碼規范配置。

eslint的詳細配置參數這里就不展開了,感興趣的同學可以去官網上自行探索。

3.4 用commitizen規范git commit

安裝:

npm install --save-dev commitizen

在package.json中配置:

  "scripts": {
    "commit": "cz"
  },
  "config": {
    "commitizen": {
      "path": "cz-conventional-changelog"
    }
  }

測試一下:

注意,這里就不能用git commit了,而要用yarn run commitnpm run commit,執行后命令行里會出現一些交互選項,來幫助我們生成git commit。

commitizen生成的commit

看不習慣英文的也可以安裝中文包:

yarn add cz-conventional-changelog-zh

中文版效果

commitizen只能幫助我們生成規范的git commit,如果有些隊友忘了使用yarn run commit,而直接用git commit -m”xxx”寫了不規范的提交信息,怎么辦?

還記得上面說的husky嗎?我們可以通過husky的commit-msg鈎子來校驗git commit的提交信息。

3.5 hook:commit-msg

yarn husky add .husky/commit-msg

修改commit-msg:

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"


commit_regex='^Merge.+|(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert|types)(\(.+\))?: .{1,50}'


if ! grep -iqE "$commit_regex" "$1"; then

echo
echo "commit信息格式錯誤!!"

echo "格式應為:[Type]: [Summary]"

echo "Type可選值為Merge|feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert|types"

echo "注意中間的空格"

echo "示例:git commit -m \"test: add something test\""

echo
exit 1

fi

測試一下:

校驗git commit的信息格式

大功告成!

4、總結

規范的代碼不僅能減少合並沖突,還有助於提高代碼的可讀性,降低之后的維護成本。

對團隊而言,有可能是鐵打的代碼流水的程序員,前人留下的坑得后人去填,規范代碼是非常必要的。

對個人而言,規范的代碼不僅能減少bug的出現,還有助於更好地理解編程語言的特性,成長有時候就是這些細節處的積累。

技術上只能起到一部分的規范作用,更重要的還是意識上的主觀能動性,只有意識到代碼規范的重要性,才能真正實現項目的代碼規范化。

附錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM