Background
Lately, I must build a common Eslint module for my job project and then upgrade our code to be standardized. It can get some advantages for us:
- Uniform code style.
- Avoid low-level syntax wrong.
- Avoid the developer using plain text instead of i18n keys in the project.
预期
将多个项目的 eslint 规则统一抽象到一个 package 中进行维护,然后子项目只需要通过对这个 package 安装后进行使用即可。同时支持 prettier + commit hook 前置校验检查。 选型:
- pnpm 多包管理,便于抽象公共模块
- eslint 本期重点
- @typescript-eslint/eslint-plugin
- @typescript-eslint/parser
- eslint
- eslint-plugin-react-hooks
- eslint-plugin-react-refresh
- prettier 代码格式统一
- husky 代码提交前强制校验 eslint & prettier & typescript 等
代码结构
- packages
- Other projects...
- eslintrc.cjs
- eslint
- lib
- index.js
- package.json
实现
1. 创建 eslint package
pnpm create @your-name/eslint
2. 安装 eslint 相关依赖
pnpm i eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint-plugin-react-hooks eslint-plugin-react-refresh
3. 配置 eslint
pnpm i -D eslint-config-prettier eslint-plugin-prettier
.eslintrc.cjs
module.exports = {
root: true,
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 2020,
sourceType: 'module',
ecmaFeatures: {
jsx: true,
},
},
extends: [
'plugin:@typescript-eslint/recommended',
'plugin:react/recommended',
'plugin:react-hooks/recommended',
'plugin:react-refresh/recommended',
'prettier',
],
rules: {
'prettier/prettier': 'error',
},
settings: {
react: {
version: 'detect',
},
},
plugins: ['@typescript-eslint', 'react', 'react-hooks', 'react-refresh', 'prettier'],
};
4. 配置 prettier
pnpm i -D prettier
.prettierrc.cjs
module.exports = {
singleQuote: true,
semi: false,
trailingComma: 'all',
arrowParens: 'always',
};
5. 配置 husky
pnpm i -D husky lint-staged
package.json
{
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"*.{js,jsx,ts,tsx}": [
"eslint --fix",
"prettier --write"
]
}
}
6. 发布
pnpm publish
7. 子项目使用
pnpm i @your-name/eslint
.eslintrc.cjs
module.exports = {
extends: '@your-name/eslint',
};
总结
通过抽象 eslint 规则到一个 package 中,可以实现多个项目的统一维护,同时支持 prettier + commit hook 前置校验检查,提高代码质量,减少低级错误。