用魔法打败魔法:前端代码规范化

无人机
• 阅读 1682

目录

  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.jsonscript中添加:

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

preparenpm的生命周期脚本。

当执行npm install的时候,就会自动执行脚本内容husky install,从而在当前项目的根目录下生成.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脚本执行成功,打印出了语句。

3.3 在pre-commit里添加eslint检查

安装:

yarn add eslint —dev

安装完成后,执行

yarn run eslint —init

./node_modules/.bin/eslint —init

用魔法打败魔法:前端代码规范化

执行完成后会自动在根目录生成eslint配置文件.eslinttrc.js

用魔法打败魔法:前端代码规范化

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

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


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

用魔法打败魔法:前端代码规范化

可以看到,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提交中

测试一下:

用魔法打败魔法:前端代码规范化

成功!

提示:如果使用的是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的配置:

用魔法打败魔法:前端代码规范化

修改一下:

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

pre-commit改为:

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

echo "eslint格式校验"

npx 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。

用魔法打败魔法:前端代码规范化

看不习惯英文的也可以安装中文包:

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

测试一下:

用魔法打败魔法:前端代码规范化

大功告成!

4、总结

规范的代码不仅能减少合并冲突,还有助于提高代码的可读性,降低之后的维护成本。

对团队而言,有可能是铁打的代码流水的程序员,前人留下的坑得后人去填,规范代码是非常必要的。

对个人而言,规范的代码不仅能减少bug的出现,还有助于更好地理解编程语言的特性,成长有时候就是这些细节处的积累。

技术上只能起到一部分的规范作用,更重要的还是意识上的主观能动性,只有意识到代码规范的重要性,才能真正实现项目的代码规范化。

附录
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java编码优化10技巧
最近,我给Java项目做了一次代码清理工作。经过清理后,我发现一组常见的违规代码(指不规范的代码并不表示代码错误)重复出现在代码中。因此,我把常见的这些违规编码总结成一份列表,分享给大家以帮助Java爱好者提高代码的质量和可维护性。这份列表没有依据任何规则或顺序,所有的这些都是通过代码质量工具包括CheckStyle(https://www.osch
前端标准化之旅
本文主要是介绍前端研发的一些标准化规范,良好的代码规范,不仅能够让代码简洁清晰,还可以减少bug的出现,更能够让看代码的人赏心悦目,本文主要从命名规范、语法规范、后端系统开发规范、版本更新规范、上线邮件申请规范、项目启动规范来、文件目录规范七方面介绍,
liam liam
2年前
不是吧,连公司里的卷王写代码都复制粘贴,这合理?
没错,我,本人,就是那种卷心菜,就是那种想卷但卷不过别人的,我每天吭哧吭哧写代码,写到办公区里空荡荡地只剩下我一个人,但我们组里,就我需求写得最慢,bug写得最多,我弟常问我:“哥,别的同事加班都没你多你绩效一定不错吧?”但、其实是因为我写不过别人,尤其公司里那个卷王,代码写得好,还写得快,改bug测试小姐姐一提他立马响应改好。搞得测试组那边买奶茶常常会
不怕天黑 不怕天黑
4年前
发现Kotlin一个神奇的bug
1、前言本文将会通过具体的业务场景,由浅入深的引出Kotlin的一个bug,并告知大家这个bug的神奇之处,接着会带领大家去查找bug出现的原因,最后去规避这个bug。2、bug复现现实开发中,我们经常会有将Json字符串反序列化为一个对象问题,这里,我们用Gson来写一段反序列代码,如下:kotlinfun<TfromJson(js
Stella981 Stella981
3年前
PHP代码静态分析工具PHPStan
<blockquote最近发现自己写的PHP代码运行结果总跟自己预想的不一样,排查时发现大多是语法错误,在运行之前错误已经种下。可能是自己粗心大意,或者说<codephpl</code检测太简单,不过的确是有一些语法错误埋藏得太深(毕竟PHP是动态语言),那么有没有办法,在代码代码正式运行之前,把语法错误全找出来呢?</blockquote<p
Wesley13 Wesley13
3年前
JS中那些鲜为人知的骚操作
前言曾经,我接手了一份大佬的代码,里面充满了各种“骚操作”,还不加注释那种,短短几行的函数花了很久才弄懂。!(https://oscimg.oschina.net/oscnet/1849cc3b16479486464799b24f7e6573185.jpg)这世上,“只有魔法才能对抗魔法”,于是后来,翻阅各种“黑魔法”的秘籍,总结了一些比较实用
Wesley13 Wesley13
3年前
GO 编码规范
编码规范本规范旨在为日常Go项目开发提供一个代码的规范指导,方便团队形成一个统一的代码风格,提高代码的可读性,规范性和统一性。本规范将从命名规范,注释规范,代码风格和Go语言提供的常用的工具这几个方面做一个说明。该规范参考了go语言官方代码的风格制定。一、命名规范命名是代码规范中很重要的一部分,统一的命名规则有
行云部署前端架构解析-前言 | 京东云技术团队
一个简单的自我介绍项目规模截止目前上万次代码提交,总代码行数超过21万行,其中人工维护的代码超过13万行,近千个文件。前端线上服务直接对接的后端服务,达十多个。跟很多应用一样,它有行云的入口,也有独立的服务,还有单独的插件接口它是行云的子应用,也是其它应用
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
无人机
无人机
Lv1
洛阳城里见秋风,欲作家书意万重。
文章
2
粉丝
0
获赞
0