- 代码风格交给eslint,其他的不要进行强制规定
在实际项目中,最好配合以下几个工具,让整个项目的代码风格统一
- eslint:代码格式检查工具
- lint-staged:对git的暂存文件进行lint检查
- husky:git钩子,能够很方便地在项目中配置git的hook操作,通过它我们能够实现在代码提交时检查并尝试修复一些代码风格问题
安装与初始化
- 直接这样一起安装几个工具:
npm install --save-dev husky lint-staged eslint
- 可以执行
./node_modules/.bin/eslint --init
对当前目录的项目进行eslint初始化,能够通过交互式的命令进行配置,完成后会在当前目录创建配置文件.eslintrc.js
1 | ? How would you like to use ESLint? … |
- 在项目的
package.json
配置husky
和lint-stage
1 | { |
如果有多个子目录需要不同的规则可以这样做
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24首先,package.json中的prepare script需要这样改。虽然不同子目录不同的规则,但是.git是一个,所以hook也只能有一个,可以在项目根目录创建和安装.husky
"prepare": "husky install .husky",
然后,在pre-commit脚本中添加逻辑,进入不同的子目录运行不同的eslint程序
!/bin/sh
. "$(dirname "$0")/_/husky.sh"
cd frontend
echo 'Check frontend code'
if [ -f "node_modules/.bin/lint-staged" ]; then
./node_modules/.bin/lint-staged
else
lint-staged
fi
cd ../backend
echo 'Check Backend code'
if [ -f "node_modules/.bin/lint-staged" ]; then
./node_modules/.bin/lint-staged
else
lint-staged
fi执行
npm prepare
会在根目录创建.husky
文件夹,并将hook应用到当前git仓库中添加
pre-commit
hook,执行命令./node_modules/.bin/husky add .husky/pre-commit "npm run lint-staged" && git add .husky/pre-commit
如果想要修改执行命令可以修改
.husky/pre-commit
例如1
2
3
4
5
6
7
8
9
10
11!/bin/sh
. "$(dirname "$0")/_/husky.sh"
cd myDir
echo 'Check My code'
if [ -f "node_modules/.bin/lint-staged" ]; then
./node_modules/.bin/lint-staged
else
lint-staged
fi
同一仓库多个目录配置
- 如果同一个仓库里面有多个目录需要配置单独的规则,那么需要在每个目录都是用
eslint init
一次,并在每个项目单独执行npm compare
命令以安装husky
到.git
的hook中并修改每个.husky/pre-commit
进入正确的目录
eslint配置
- eslint规则官方网站
eslint常用命令
1 | eslint file.js # 校验指定文件 |
eslint规则配置
全局配置
以下配置都是在.eslintrc.js
中
1 | module.exports = { |
指定代码单独/忽略配置
- 除了使用rules来全局忽略某些配置以外,还能在局部忽略某些配置,例如:
1 | // eslint-disable-next-line no-undef // 能忽略下一行出现的未定义错误,如cordova |
单独忽略指定文件
- 需要在
.eslintignore
中添加文件,语法同.gitignore
TroubleShooting
Requires Promise-like values to be handled appropriately (
no-floating-promises
): Promise必须要能正确处理响应与异常,可以加上then
和catch
1
2
3
4
5(async () => {
...
})() // 需要加上下面的then和catch才能避免错误提示,也是一种很好的编码习惯
.then(() => { console.log('Start Success') })
.catch(() => { console.log('Start Failed') })Require statement not part of import statement. 引入包的方式不同,需要将包引入方式改为允许的方式,例如
将const path = require('path')
改为import path = require('path')
ESLint: iterators/generators require regenerator-runtime, which is too heavyweight for this guide to allow them. Separately, loops should be avoided in favor of array iterations.(no-restricted-syntax): 这是
Airbnb
中的一条规则no-restricted-syntax
会禁用一些新特性新语法,比如for await ... in
,如果要禁用不建议在rules
中整个禁用,直接在使用的地方加// eslint-disable-next-line no-restricted-syntax
吧lint-staged Node.js requirement to 12.13.0: 最新版本的
lint-staged
要求node版本>=12.13.0(21年的),或者降级lint-staged
eslint.rc里面的excludes不起作用,tsc的时候仍然去检查了node_modules里面的东西: 尝试升级
typescript
到3.9.*及以上Parameter ‘xxx’ implicitly has an ‘any’ type: 要求太严的话就修改tsconfig.json,将compilerOptions下的noImplicitAny设置为false
“parserOptions.project” has been set for @typescript-eslint/parser: 可以把
.eslintrc.js
文件加入.eslintignore
中,或者把.eslintrc.js
改成json后缀和格式,居然就可以了no-plusplus: 禁止使用一元操作符
++
或--
,是因为空白可能会改变源代码的语义,可以使用+=
来代替consistent-return: 原因是函数的返回值的类型不统一,可以自行修改一下
react camel case props: 在react中禁止非驼峰写法的props,如果实在改不了,可以给它重命名:
{first_name: firstName, last_name: lastName}
使用git的UI客户端,例如sourcetree,没有触发husky/eslint:这个一般是由于sourcetree没有找到node导致,首先我们需要去sourcetree->Preference->Advanced->Always display full console output,打开后再次commit就会发现错误日志:
Can't find npx in PATH: ...Skipping pre-commit hook
,找不到node路径直接跳过了pre-commit hook。此时只需要将node路径加入环境变量即可。一般是由于我们使用的是nvm,我们只需要将nvm路径加入husky的环境变量即可:1
2
3
4
5vim ~/.huskyrc,这个文件就是用于加载这些环境变量的,注意这是home目录不是项目目录
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
export PATH="/Users/haofly/.nvm/versions/node/v15.3.0/bin:$PATH" # 上面的配置还是不行那直接加到PATH吧No files matching the pattern "" were found
: 找不到符合条件的文件就找不到嘛,非要抱个错出来,可以给eslint
命令加上--no-error-on-unmatched-pattern