React ts项目配置Eslint+StyleLint+prettier+husky+lint-staged规范

下载相关依赖

npm install eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin prettier eslint-config-prettier eslint-plugin-prettier stylelint stylelint-config-css-modules stylelint-config-standard stylelint-less stylelint-order  -D

版本号如下

{
    "@typescript-eslint/eslint-plugin": "^5.57.0",
    "@typescript-eslint/parser": "^5.57.0",
    "eslint": "^8.36.0",
    "eslint-config-prettier": "^8.8.0",
    "eslint-plugin-prettier": "^4.2.1",
    "eslint-plugin-react": "^7.32.2",
    "prettier": "^2.8.7",
    "stylelint": "^14.6.1",
    "stylelint-config-css-modules": "^4.1.0",
    "stylelint-config-standard": "^25.0.0",
    "stylelint-less": "^1.0.6",
    "stylelint-order": "^5.0.0",
}

eslint: ESLint的核心代码
@typescript-eslint/parser:ESLint的解析器,用于解析typescript,从而检查和规范Typescript代码
@typescript-eslint/eslint-plugin:这是一个ESLint插件,包含了各类定义好的检测Typescript代码的规范
prettier:prettier插件的核心代码
eslint-config-prettier:解决ESLint中的样式规范和prettier中样式规范的冲突,以prettier的样式规范为准,使ESLint中的样式规范自动失效
eslint-plugin-prettier:将prettier作为ESLint规范来使用
stylelint:stylelint的核心代码
stylelint-config-css-modules:提供了一个预设的规则集合,用于帮助开发者检查或修复CSS模块化开发中的问题。使用该包的目的是为了提高代码的可维护性和一致性,避免样式命名冲突与重复,并且能够帮助开发者把握CSS模块化开发的最佳实践。
stylelint-config-standard:预设的Stylelint配置文件,其定义了一组约定俗成的代码规则和最佳实践,可以帮助开发者避免一些常见的CSS错误和问题,保持代码风格的统一性和可维护性
stylelint-less:对Less文件进行语法检查和规则校验。它能够识别Less中的变量、混合函数等特性,并提供了相应的规则校验
stylelint-order:用于样式表(CSS、Sass、Less等)中规则的排序和风格检查工具

配置相关文件

1、新建.eslintrc.js文件

module.exports = {
  parser: "@typescript-eslint/parser",
  extends: [
    "plugin:react/recommended",
    "plugin:@typescript-eslint/recommended",
    "eslint-config-prettier",
    "plugin:prettier/recommended",//覆盖eslint
  ], //使用推荐的React代码检测规范
  plugins: ["@typescript-eslint"],
  env: {
    browser: true,
    node: true,
  },
  settings: {
    //自动发现React的版本,从而进行规范react代码
    react: {
      pragma: "React",
      version: "detect",
    },
  },
  parserOptions: {
    //指定ESLint可以解析JSX语法
    ecmaVersion: 2019,
    sourceType: "module",
    ecmaFeatures: {
      jsx: true,
    },
  },
  rules: {},
};

2、新建.prettierrc.js文件

module.exports = {
  "printWidth": 120,
  "semi": false,
  "singleQuote": true,
  "trailingComma": "all",
  "bracketSpacing": false,
  "jsxBracketSameLine": true,
  "arrowParens": "avoid",
  "insertPragma": true,
  "tabWidth": 4,
  "useTabs": false  
};

3、新建.stylelintrc.js文件

module.exports = {
  processors: [],
  plugins: ['stylelint-order'],
  extends: ['stylelint-config-standard', 'stylelint-less', 'stylelint-config-css-modules'],
  rules: {
    'no-empty-source': true,
    'selector-class-pattern': null,
    'selector-id-pattern': null,
    'at-rule-no-unknown': null,
    'order/properties-order': [
      // 规则顺序
      'position',
      'top',
      'right',
      'bottom',
      'left',
      'z-index',
      'display',
      'float',
      'width',
      'height',
      'max-width',
      'max-height',
      'min-width',
      'min-height',
      'padding',
      'padding-top',
      'padding-right',
      'padding-bottom',
      'padding-left',
      'margin',
      'margin-top',
      'margin-right',
      'margin-bottom',
      'margin-left',
      'margin-collapse',
      'margin-top-collapse',
      'margin-right-collapse',
      'margin-bottom-collapse',
      'margin-left-collapse',
      'overflow',
      'overflow-x',
      'overflow-y',
      'clip',
      'clear',
      'font',
      'font-family',
      'font-size',
      'font-smoothing',
      'osx-font-smoothing',
      'font-style',
      'font-weight',
      'line-height',
      'letter-spacing',
      'word-spacing',
      'color',
      'text-align',
      'text-decoration',
      'text-indent',
      'text-overflow',
      'text-rendering',
      'text-size-adjust',
      'text-shadow',
      'text-transform',
      'word-break',
      'word-wrap',
      'white-space',
      'vertical-align',
      'list-style',
      'list-style-type',
      'list-style-position',
      'list-style-image',
      'pointer-events',
      'cursor',
      'background',
      'background-color',
      'border',
      'border-radius',
      'content',
      'outline',
      'outline-offset',
      'opacity',
      'filter',
      'visibility',
      'size',
      'transform',
    ],
  },
}

以上便可以在项目中启用Eslint+prettier+styleLint来规范项目代码,如果在项目需忽略指定文件的检查则可分别配置.eslintignore、.stylelintignore文件

另外我们往往需要在git提交前检查我们的代码是否符合规范,因此我们借助husky和lint-staged来创建hook

安装依赖

npm install husky lint-staged -D

版本号如下:

{
   "husky": "^8.0.3",
    "lint-staged": "^13.2.0",
}

在项目根目录执行husky install生成.husky目录

npx husky install

其他同事拉取项目时,他们可能会忘记执行上面的命令启用 git hook。但有一个命令他们是一定会执行的,就是执行 npm install 或 yarn 去安装依赖。
于是我们需要利用 npm script 的生命周期脚本,加上一个 prepare。prepare 会在 install 之后执行。

// package.json
{
  "scripts": {
   // ...
    "prepare": "husky install"
  }
}

创建hook

npx husky add .husky/pre-commit "npx --no-install lint-staged"

创建的脚本内容如下:

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

npx --no-install lint-staged

在package.json中新建内容如下:

// package.json
{
  "lint-staged": {
    "src/**/*.{ts,tsx}": [
      "eslint --max-warnings=0"
    ],
    "src/**/*.{css,less}": [
      "stylelint"
     ]
  }
}

至此,则 lint-staged 就设置完成,当再次使用 git commit 提交代码的时候,就会先执行代码检查、样式表检查之类的动作,并且是增量代码检查。

跳过 git hooks

如果我们想要跳过 commit 相关的hook,可以使用在脚本命令中加上 --no-verify 参数,如下所示:

git commit -m '跳过hook' --no-verify

如果我们使用vscode编辑器,可配置保存自动通过eslint格式化和styleLint代码
下载vscode插件 ESlint 、 prettier、styleLint 然后配置settings.json文件

{
    "editor.codeActionsOnSave": {
        "source.fixAll.stylelint": true,
        "source.fixAll.eslint": true 
    },
   "eslint.validate": [ //确定校验准则
        "javascript",
        "javascriptreact",
        "html",
        "vue",
        "typescript",
        "typescriptreact",
    ],
}

另外我们可以通过配置.editorconfig 定义项目中代码格式的一些规则

root = true

[*]
indent_style = space
indent_size = 2
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
end_of_line = lf

[*.md]
trim_trailing_whitespace = false

思考:

1、.editorconfig 和 eslint 不会冲突,因为它们解决的问题不同。
.editorconfig 是一种跨编辑器的配置文件格式,用于定义代码风格、缩进、换行等基本格式规范,是在编辑器级别上管理代码风格的工具。
eslint 是一种 JavaScript 代码静态分析工具,用于检测代码中的潜在问题和错误,并推荐一些最佳实践,以提高代码质量。
虽然它们有一些相似之处,但 .editorconfig 和 eslint 都是解决不同的问题,并可以一起使用。通常情况下,.editorconfig 中的一些格式规范可以与 eslint 中的规则进行补充。
2、.editorconfig 和 Prettier 不会冲突,它们可以共存。.editorconfig 用于定义项目中代码格式的一些规则,例如缩进、tab 大小等。而 Prettier 则是一个代码格式化工具,它可以自动将代码格式化成符合规范的形式。
在使用 Prettier 的情况下,你可以在 .prettierrc (Prettier 配置文件) 中指定代码格式化的规则,然后在 .editorconfig 中定义项目中的其他代码格式规则。这两个工具可以一起使用,以保持代码风格的一致性。

问题

.editorconfig和prettier有规则冲突时如何处理

当.editorconfig和prettier之间出现规则冲突时,可以尝试以下方法:
禁用.editorconfig中与prettier冲突的规则:在editorconfig文件中将与prettier冲突的规则注释掉或删除,使editorconfig中的规则与prettier一致。
调整prettier配置:根据.editorconfig文件中的规则调整prettier的配置,以确保两者的规则一致。
使用eslint作为代码格式化工具:eslint可以与prettier配合使用,避免规则冲突的问题。可以在.eslintrc文件中设置代码格式化相关的规则,然后通过eslint进行代码格式化。
增加特定的prettier规则:可以在prettier配置中针对.editorconfig中的规则增加特定的配置项,以确保两者的规则一致。例如,在prettier配置中增加tabWidth选项来匹配.editorconfig中的缩进规则。
总之,处理.editorconfig和prettier的规则冲突需要根据具体情况进行调整,可以采取多种方法,以达到使两者规则一致的目的。

你可能感兴趣的:(React ts项目配置Eslint+StyleLint+prettier+husky+lint-staged规范)