使用Husky提升你的项目规范
使用 ESLint, Prettier, Husky, Lint-staged 提升你的项目规范
本文写于 2020 年 11 月 7 日
大家应该都知道 ESLint 与 prettier,他们的用途分别在于约束代码和美化代码格式。
但我们并不能保证每次提交代码之前我们的项目都执行过了 ESLint 与 prettier,所以我们需要 Git Hook,它能让我们在 git 操作的各个阶段进行一些自定义的操作。
例如在 commit 时,我们会在 commit 之前执行 ESLint 与 prettier,如果执行出错,git 就会停止 commit 操作。
本文介绍的流程为:
- 利用 ESLint 和 Prettier 来提升代码质量;
- 套用如 Airbnb Style Guide 这类大型团队的 Style Guide;
- 使用
yarn/npm run lint
来格式化所有代码; - 使用 Husky 及 Lint-staged 在 git commit 之前测试代码品质。
Prettier
首先介绍 Prettier,一个代码格式化工具。
Prettier 主要用来整理我们的代码格式。它刻意不提供太多的客制化功能,目的是不让开发团队花太多时间在讨论该用怎样的 Style,而能够有个一致的设计规范。
即使使用上 Prettier 绝大多数的定制选项,你的 JSON 文件也许也就只有 10 行。
Prettier 提供的另一项好处就是安装后即可上手,要安装只需要:yarn add --dev prettier
,然后 ./node_modules/.bin/prettier --write file-path
即可格式化文件。
官网写的是 --write .
可以格式化所有文件,但在尝试后发现不太行,我们需要使用通配符来配置:./node_modules/.bin/prettier --write src/**
。
如果想要定制一些选项,可以创建 .prettierrc.json
文件,具体配置可以在官网查询,只有十几项。如果存在想忽略的文件夹,则可以新建一个 .prettierignore
文件夹。
ESLint
Linter 是一种静态程式分析的工具,能够帮助使用者找出程式中不符合团队定义之规则的代码。
对于 Javascript 这种动态的、弱类型的语言,如果能够加上一个在写程式时就提醒我们,哪一段代码在执行时可能会出问题的工具,可谓百利而无害!
ESLint 跟 Prettier 的区别在于:Prettier 旨在统一「代码样式」,而 ESLint 则重视「代码质量」。
例如在 ES6 环境中使用 const/let
而非 var
、移除未被使用而无意义的 import
、若是 function
的循环复杂度过高则需要调整设计等。
eslint 的另一个好处是:我们可以使用别人设定好的规则。
以这几年最流行的 Style Guide 为例:为 Github、MongoDB 等知名公司所使用的 Javascript Standard Style;Airbnb 所使用的 Airbnb Style Guide;以及 Google 的 Google Style Guide。
我比较喜欢 Airbnb 的 Style。
首先,可以安装 eslint:yarn add eslint
,然后可以使用 npx eslint --init
。一步步跟随者他的引导,选择 Airbnb 的代码样式。
eslint 有两个常用的命令:eslint --fix file-path
与 eslint file-path
。前者是修复可以自动修复的错误,后者是寻找是否存在 eslint 可以检查出得错误。
加入 scripts
这个时候我们的流程应该是什么呢?
- 首先使用 prettier 格式化代码;
- 然后使用 eslint 修复可以自动修复的错误;
- 最后再使用 eslint 查看哪些文件存在错误,我们去一一进行修改。
所以,我们可以将这些操作加进 package.json
的 scripts
之下:
"scripts": {
"lint": "./node_modules/.bin/prettier --write 'src/**' && ./node_modules/.bin/eslint --fix 'src/**' && ./node_modules/.bin/eslint ."
}
Husky 与 Lint-staged
当我们有了 Prettier 和 ESLint,在开发时已经能为我们避免掉许多不符合要求的代码了。或是当我们拿到一个新项目的时候,也可以通过这些步骤去格式化整个工程。
但就像文章开头说的那样,我们还需要 git hook 来帮助我们在 git 操作时进行操作——可以使用 Husky。
Husky 可以让我们在 git commit 或 git push 时执行一些动作,而 Lint-staged 则让我们可以 lint 那些已经 git add 的文件。
这两者的组合能够在我们真正 commit 之前就检查我们的代码是否符合我们的要求,同时可以主动帮我们修好一些能够修的错误。
yarn add -D husky lint-staged
接着在根目录创建 .huskyrc.json
,写入:
{
"hooks": {
"pre-commit": "lint-staged"
}
}
然后再在根目录创建 .lintstagedrc.json
,来检查并修正文件:
{
"*.+(ts|js|tsx|jsx)": ["prettier --write", "eslint --fix"],
"*.+(json|css|md)": ["prettier --write"]
}
如此一来,你每次 commit 之前,都会对文件执行操作了。
(完)
使用Husky提升你的项目规范的更多相关文章
- eslint+prettier+husky+lint-staged 统一前端代码规范
eslint+prettier+husky+lint-staged 统一前端代码规范 遵循编码规范和使用语法检测,可以很好的提高代码的可读性,可维护性,并有效的减少一些编码错误. 1.终极目标 团队中 ...
- PAIP.提升效率----论项目知识库的建设。。
PAIP.提升效率----论项目知识库的建设.. 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net ...
- 为了增强团队的协作和高效开发,提升代码质量,TGideas团队一起制订的代码规范。主要包括五部分内容:PC规范、移动端规范、性能优化、CP规范、其他项目规范
http://tguide.qq.com/main/index.htm
- 分享一篇vue项目规范
最近 Vue 用的比较多,而且因为公司里有实习生,当几个人写一个项目的时候,会出现很多问题,最麻烦的就是规范不统一,之前我有一篇文章是说, vue 是比较有规范的一种框架了,但是也会出现很多问题,所以 ...
- java项目规范
一.命名规范 1. 项目名全部小写 2. 包名全部小写 3. 类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写. 如:public class MyFirstClass{} 4. 变量 ...
- web前端项目规范
项目目录规范 . ├─ css ├─ component ├─ img ├─ js ├─ page ├─ test ├─ package.json ├─ README.md css 存放样式类文件,且 ...
- React凤凰项目规范
技术资源 基础语法 ES6 TS 框架 React Redux React-redux React-Router UmiJS Dva 组件库 AntDesign AntV 构建编译 Webpack b ...
- ATM购物车程序项目规范(更新到高级版)
ATM购物车程序(高级版) 之前的低级版本已经删除,现在的内容太多,没时间把内容上传,有时间我会把项目源码奉上! 我已经把整个项目源码传到群文件里了,需要的可以加主页qq群号.同时群内也有免费的学习资 ...
- 项目规范和建立-从frozenui学习
1.分支branches开发新功能,主干trunk是稳定发布的.因为frozenui下载完,看到branches比trunk多了一个版本 2.版本号定义,主版本.次版本.修订号 大版本号: 主版本号: ...
随机推荐
- My模板设计模式
模板模式 目标: 第一个设计模式:模板模式 步骤: 第一个设计模式:模板模式 讲解: 我们现在使用抽象类设计一个模板模式的应用, 例如在小学的时候,我们经常写作文,通常都是有模板可以套用的. 假如我现 ...
- 1kb 的 placeholder.js 增加 img 标签使用方式
预览 官方网站示例. 项目 github 地址 使用 引入 placeholder.js 到你的前段代码中: <script src="placeholder.js"> ...
- buuoj [RoarCTF 2019]Easy Calc(利用PHP的字符串解析特性)
web [RoarCTF 2019]Easy Calc(利用PHP的字符串解析特性) 先上源码 <?phperror_reporting(0);if(!isset($_GET['num'])){ ...
- java中请给出一个return this的例子。
[新手可忽略不影响继续学习]下面例子中setYear中的return this;返回了一个指向对象的指针,this.setMonth(8).setDay(20);是合法的,如果像原来的例子一样什么都不 ...
- Python疫情爬取输出到txt文件
在网上搬了一个代码,现在不适用了,改了改 import requestsimport jsondef Down_data(): url = 'https://view.inews.qq.com/g2/ ...
- Java报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.sirifeng.babytun.dao.GoodsDAO.findById
前言 最近学vue学得差不多了,想来搭个项目实战一下,结果刚开始搭建SSM框架的时候就来到了我们最喜欢的debug环节 org.apache.ibatis.binding.BindingExcepti ...
- SpringMVC获取请求参数-集合类型
1.创建User实体类 ```java public class User { private String username; private int age; public String getU ...
- 帝国cms随机调用信息
我们知道,帝国cms随机调用标签是 [ecmsinfo]1,5,32,0,0,2,0,",'rand()'[/ecmsinfo] 但是这种调用方式在数据量特别大的时候严重影响生成速度,对于中 ...
- 在Vue3项目中使用pinia代替Vuex进行数据存储
pinia是一个vue的状态存储库,你可以使用它来存储.共享一些跨组件或者页面的数据,使用起来和vuex非常类似.pina相对Vuex来说,更好的ts支持和代码自动补全功能.本篇随笔介绍pinia的基 ...
- 基于kubernetes的分布式限流
做为一个数据上报系统,随着接入量越来越大,由于 API 接口无法控制调用方的行为,因此当遇到瞬时请求量激增时,会导致接口占用过多服务器资源,使得其他请求响应速度降低或是超时,更有甚者可能导致服务器宕机 ...