一、概述:
- Typescript 主要有两种选择 ESLint 和 TSLint;
- ESLin:规范 JS 代码,通过配置解析器,也能规范 TS 代码;
- TypeScript 官方采用 ESLint,把仓库作为测试平台,ESLint 的 TypeScript 解析器成为独立项目,解决双方兼容性问题。
二、 ESLint 规范 Typescript
- 首先安装依赖:
npm i -d eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin
- 这三个依赖分别是:
- eslint: ESLint 的核心代码;
- @typescript-eslint/parser:ESLint 的解析器,解析 TypeScript,检查和规范 TypeScript 代码;
- @typescript-eslint/eslint-plugin:ESLint 插件,包含了定义好的检测 TypeScript 代码的规范。
- 根目录下新建
.eslintrc.js
文件,该文件中定义了 ESLint 的基础配置,一个最为简单的配置如下所示:
module.exports = {
// 定义ESLint的解析器
parser: '@typescript-eslint/parser',
// 定义文件继承的子规范
extends: ['plugin:@typescript-eslint/recommended'],
// 定义了该eslint文件所依赖的插件
plugins: ['@typescript-eslint'],
// 指定代码的运行环境
env: {
browser: true,
node: true,
}
};
- 在 TS 项目中必须执行解析器为@typescript-eslint/parser,才能正确的检测和规范 TS 代码;
- env 环境变量配置:如 console 属性只有在 browser 环境下才会存在,如果没有设置支持 browser,不能报 console is undefined 的错误。
三、ESLint 规范 React
- TS 项目中同时使用 React:必须安装插件 eslint-plugin-react,增加配置:
module.exports = {
parser: '@typescript-eslint/parser',
extends: [
'plugin:react/recommended',
'plugin:@typescript-eslint/recommended'
],
// 使用推荐的React代码检测规范
plugins: ['@typescript-eslint'],
env: {
browser: true,
node: true,
},
// 自动发现React的版本,从而进行规范react代码
settings: {
"react": {
"pragma": "React",
"version": "detect"
}
},
// 指定ESLint可以解析JSX语法
parserOptions: {
"ecmaVersion": 2019,
"sourceType": 'module',
"ecmaFeatures": {
jsx: true
}
},
rules: {
}
};
- 在 Rules 中自定义 React 代码编码规范。
四、结合 Prettier 和 ESLint 来规范代码
- Prettier 中文:漂亮的、美丽的,是一个流行的代码格式化的工具;
- 首先安装三个依赖:
npm i -g prettier eslint-config-prettier eslint-plugin-prettier
- 参数:
- prettier:prettier 插件的核心代码;
- eslint-config-prettier:解决 ESLint 中的样式规范和 prettier 中样式规范的冲突,以 prettier 的样式规范为准,使 ESLint 中的样式规范自动失效;
- eslint-plugin-prettier:将 prettier 作为 ESLint 规范来使用。
- 项目根目录下创建
.prettierrc.js
文件:
module.exports = {
"printWidth": 120,
"semi": false,
"singleQuote": true,
"trailingComma": "all",
"bracketSpacing": false,
"jsxBracketSameLine": true,
"arrowParens": "avoid",
"insertPragma": true,
"tabWidth": 4,
"useTabs": false
};
- 修改
.eslintrc.js
文件,引入 prettier:
module.exports = {
parser: '@typescript-eslint/parser',
extends: [
'prettier/@typescript-eslint',
'plugin:prettier/recommended'
],
settings: {
"react": {
"pragma": "React",
"version": "detect"
}
},
parserOptions: {
"ecmaVersion": 2019,
"sourceType": 'module',
"ecmaFeatures": {
jsx: true
}
},
env: {
browser: true,
node: true,
}
};
上述新增的 extends 的配置中:
- prettier/@typescript-eslint:使 @typescript-eslint 中的样式规范失效,遵循prettier 中的样式规范;
- plugin:prettier/recommended:使用 prettier 中的样式规范,且如果使用 ESLint 会检测 prettier 的格式问题,同样将格式问题以 error 的形式抛出。
五、在 VSCode 中集成 ESLint 配置
- VSCode 中集成 ESLint 的配置,使代码在保存或者代码变动时,自动进行 ESLint的 fix 过程;
- 首先安装 VSCode 的 ESLint 插件,在 settings.json 文件中修改其配置文件为:
{
"eslint.enable": true,
//是否开启vscode的eslint
"eslint.autoFixOnSave": true,
//是否在保存的时候自动fix eslint
"eslint.options": {
//指定vscode的eslint所处理的文件的后缀
"extensions": [
".js",
".vue",
".ts",
".tsx"
]
},
"eslint.validate": [
//确定校验准则
"javascript",
"javascriptreact",
{
"language": "html",
"autoFix": true
},
{
"language": "vue",
"autoFix": true
},
{
"language": "typescript",
"autoFix": true
},
{
"language": "typescriptreact",
"autoFix": true
}
]
}
注意:
- eslint.options 中可以通过 configFile 属性来执行 eslint 规范的绝对路径,默认会向上查找,在根路径中指定;
- eslint.validate 中必须通过 { language: XXX} 的形式来指定 typescript 和typescriptreact。
六、husky 和 lint-staged 构建代码工作流
- husky、Husky 可以阻挡住不好的代码提交和推送;
- 在 package.json 中定义如下的 script:
"scripts": {
"lint": "eslint src --fix --ext .ts,.tsx "
}
- 在 package.json 定义 husky 的配置:
"husky": {
"hooks": {
// 执行一个 npm 命令来做 lint 校验
"pre-commit": "npm run lint"
}
}
- 在 git 的 hook 的阶段来执行相应的命令,比如上述的例子是在 pre-commit 这个 hook 也就是在提交之前进行 lint 的检测;
- 用 pre-comit 在 hook 中定义了 npm lint 命令来做 lint 校验;
- 也可以直接通过使用 lint-staged,来在提交前检测代码的规范,需修改package.json 文件:
{
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"*.{.ts,.tsx}": [
"eslint",
"git add"
]
}
}
- 同样实现 git commit 的时候做 lint 的检测。
七、gitlab 的 CI/CD 规范代码
-
通过 git 的 hook 来执行代码的规范检测有一个问题:
- 在 git commit 的时候通过
--no-verify
来跳过代码的规范检测; - 某些情况下,对于某一个重要分支,该分支上的代码必须完整通过代码的规范检测,此时可以使用 gitlab 的 CI/CD。
- 在 git commit 的时候通过
同样在 package.json 中增加一个 lint 的 npm 命令:
"scripts": {
"lint": "eslint src --fix --ext .ts,.tsx "
}
- 在根目录增加
.gitlab-ci.yml
文件,配置为:
stages:
- lint
before_script:
- git fetch --all
- npm install
lint:
stage: lint
script:
- npm run lint
only
- 特定分支1
- 特定分支2
- 配置相应的 gitlab runner,之后在指定的分支上的提交或者 merge 都会进行所配置的命令检测。这样保证了特定分支不受 git commit 跳过操作
--no-verify
的影响。