ESLint + Prettier + husky + Lint-staged + commitlint:统一前端代码规范

目前在多人项目开发时发现很多代码不规范的地方,因为每个项目都是多人维护,再加上各种历史代码的不同风格,这些情况很容易就造成了代码规范落地难,项目中出现大量低质量代码,代码格式难统一。

所以采用eslint+husky+prettier+lint-staged+commitlint这几个工具能够有效解决上述问题。

一.示例

1.如下图,由于pre-commit钩子捕获到eslint报错,所以会阻止commit提交

image

2.下面两图代码格式问题,多行空格,句尾无分号,双引号,看看提交后如下,husky会监听到pre-commit钩子,在 commit 之前,将暂存区的内容做一次 代码检查 和 代码美化,然后再添加到暂存区;然后再 commit

commit前:(多行空格,句尾无分号,双引号)

image

commit后: (完美格式化)

image

3.commitlint校验你的commit信息,提供多种共享配置

错误写法:

image

正确写法:

image

二.配置

安装依赖

npm install -D eslint prettier husky lint-staged@8 @commitlint/config-conventional @commitlint/cli eslint-config-prettier

1.eslint

参考官方文档配置好 .eslintrc .eslintignore文件

https://eslint.bootcss.com/

2.prettier

参考官方文档配置好 .prettierrc .prettierignore文件

https://prettier.io/

3.husky

定义 ---> 是一个为 git 客户端增加 hook 的工具。安装后,它会自动在仓库中的 .git/ 目录下增加相应的钩子;比如 pre-commit 钩子就会在你执行 git commit 的触发。我们可以在 pre-commit 中实现一些比如 lint 检查、单元测试、代码美化等操作。

开始如下配置:

npx husky install

为了在安装后自动启动 Git hooks,package.json 需要添加 prepare 脚本:

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

做完以上工作,就可以使用 husky 创建一个 hook 了:

npx husky add .husky/pre-commit "npx lint-staged"

脚本如下:

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

npx lint-staged

4.lint-staged

定义 ---> 是一个仅仅过滤出 Git 代码暂存区文件(被 git add 的文件)的工具;这个很实用,因为我们如果对整个项目的代码做一个检查,可能耗时很长,如果是老项目,要对之前的代码做一个代码规范检查并修改的话,这可能就麻烦了,可能导致项目改动很大。所以这个 lint-staged,对团队项目和开源项目来说,是一个很好的工具,它是对个人要提交的代码的一个规范和约束。

此时我们已经实现了监听 Git hooks,接下来我们需要在 pre-commit 这个 hook 使用 Lint-staged 对代码进行 prettier 的自动化修复和 ESLint 的检查,如果发现不符合代码规范的文件则直接退出 commit。

并且 Lint-staged 只会对 Git 暂存区(git add 的代码)内的代码进行检查而不是全量代码,且会自动将 prettier 格式化后的代码添加到此次 commit 中。

开始如下配置:

在 package.json 中配置:

"lint-staged": {
    "miniapp/**/*.{js,sjs,ts,tsx}": [
      "prettier --write",
      "eslint --fix --ext .js"
    ],
    "miniapp/**/*.{css,less}": "prettier --write"
  }

上面的配置是指对 js,sjs,ts,tsx进行 prettier 格式化,然后执行 eslint。对样式文件只需要 prettier 就足够了。

5.commitlint

定义 ---> 就是校验你的commit信息的,提供多种共享配置

开始如下配置:

添加commit-msg脚本

npx husky add .husky/commit-msg 'npx --no-install commitlint --edit "$1"'

脚本如下:

#!/bin/sh

"$(dirname "$0")/_/husky.sh"

npx --no-install commitlint --edit "$1"

然后生成配置文件commitlint.config.js,当然也可以是 .commitlintrc.js

echo "module.exports = {extends: ['@commitlint/config-conventional']};" > commitlint.config.js

常用的type类别如下:

  • upd:更新某功能(不是 feat, 不是 fix)

  • feat:新功能(feature)

  • fix:修补bug

  • docs:文档(documentation)

  • style: 格式(不影响代码运行的变动)

  • refactor:重构(即不是新增功能,也不是修改bug的代码变动)

  • test:增加测试

  • chore:构建过程或辅助工具的变动

例如:

git commit -m 'feat(husky): 增加 xxx 功能'
git commit -m 'bug(husky): 修复 xxx 功能'

5.配合vscode插件配套使用

vscode安装eslint插件

在setting.json中配置:

{
    "workbench.iconTheme": "vscode-icons",
    "[javascript]": {
        "editor.defaultFormatter": "HookyQR.beautify"
    },
    "explorer.confirmDragAndDrop": false,
    "[html]": {
        "editor.defaultFormatter": "vscode.html-language-features"
    },
    "[vue]": {
        "editor.defaultFormatter": "octref.vetur"
    },
    "beautify.config": "",
    "eslint.autoFixOnSave": true,  //  启用保存时自动修复,默认只支持.js文件
    "eslint.validate": [
        "javascript",  //  用eslint的规则检测js文件
        {
        "language": "vue",   // 检测vue文件
        "autoFix": true   //  为vue文件开启保存自动修复的功能
        },
        {
        "language": "html",
        "autoFix": true
        },
    ],
    "editor.codeActionsOnSave": {
        "source.fixAll.eslint": true
    },
    "javascript.updateImportsOnFileMove.enabled": "never",
    "eslint.codeAction.disableRuleComment": {},
    "editor.tabSize": 4,
    "editor.detectIndentation": false,
    "editor.renderControlCharacters": true,
    "editor.renderWhitespace": "all",
    "window.zoomLevel": 0,
    "diffEditor.ignoreTrimWhitespace": false,
    "terminal.integrated.rendererType": "dom",
    "eslint.codeAction.showDocumentation": {

    
    },
    "eslint.migration.2_x": "off",
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容