eslint + prettier + husky + lint-staged实践(多package)

2,087 阅读2分钟

eslint

作用: 通过制定规则,检查代码,代码格式美化,避免bug的产生

npm install eslint --save-dev

./node_modules/.bin/eslint --init
  • 按照团队习惯配置.eslintrc
  • 对于不需要进行检查文件,配置到.eslintignore中

pretitter

作用:代码美化

Husky

作用:防止bad commit

lint-staged

作用:在代码提交前执行预定义的task,保证代码质量

执行流程:

  1. 待提交的代码git add 添加到暂存区;
  2. 执行 git commit;
  3. husky注册在git pre-commit的钩子函数被调用,执行lint-staged;
  4. lint-staged 取得所有被提交的文件依次执行写好的任务(ESLint 和 Prettier);
  5. 如果有错误(没通过ESlint检查)则停止任务,同时打印错误信息,等待修复后再执行commit;
  6. 成功commit,可push到远程
package.json
{
  "scripts": {
    "precommit": "lint-staged"
  },
  "devDependencies": {
    "babel-eslint": "^10.0.3",
    "eslint": "^6.4.0",
    "eslint-config-airbnb": "^18.0.1",
    "eslint-config-prettier": "^6.3.0",
    "eslint-plugin-import": "^2.18.2",
    "eslint-plugin-jsx-a11y": "^6.2.3",
    "eslint-plugin-prettier": "^3.1.0",
    "eslint-plugin-react": "^7.14.3",
    "eslint-plugin-react-hooks": "^1.7.0",
    "lint-staged": "^9.2.5",
    "prettier": "^1.18.2"
  },
  "lint-staged": {
    "src/**/*.js": [
      "eslint --fix --ext .js",
      "prettier --write",
      "git add"
    ]
  }
}

.prettierrc
{
    "printWidth": 120, 
    "semi": false, 
    "singleQuote": true,
    "trailingComma": "es5"
}

.eslintrc
{
    "env": {
        "browser": true,
        "es6": true
    },
    "extends": ["airbnb", "prettier/react", "prettier"],
    "globals": {
        // 预置的全局变量
    },
    
    // 使得高级语法能够被识别,如装饰器
    "parser": "babel-eslint",
    "parserOptions": {
        "ecmaFeatures": {
            "jsx": true,
            "legacyDecorators": true
        },
        "ecmaVersion": 2018,
        "sourceType": "module"
    },
    "plugins": ["jsx-a11y", "react-hooks"],
    "rules": {
        // 根据项目需要,自定义lint规则
    }
}


遇到的问题

{
  "scripts": {
    "precommit:client": "cd client && npm run precommit",
    "precommit:server": "cd server && npm run precommit"
  },
  "devDependencies": {
    "husky": "^3.0.5",
    "npm-run-all": "^4.1.5"
  },
  "husky": {
    "hooks": {
      "pre-commit": "npm-run-all precommit:*"
    }
  }
}

  • vscode中es高级语法不支持,需要创建jsconfig.json,并添加如下配置
jsconfig.json
{
    "include": ["src/**/*"],
    "compilerOptions": {
        "experimentalDecorators": true
    }
}
  • 一个项目中有多个package时,如果只想packageA添加eslint,需要进行如下配置,否则不生效
在更目录下创建.vscode目录,然后创建settings.json,配置如下
{
    "editor.formatOnSave": false,
    "eslint.autoFixOnSave": true,
    "eslint.enable": true,
    "eslint.workingDirectories": ["./packageA"]
}
在.eslintrc中添加如下配置
"settings": {
    "import/resolver": {
        "alias": {
          "map": [
            ["aaa", "./src/aaa"],
            ["common", "./src/common"]
          ],
          "extensions": [".js", ".jsx", ".json"]
        }
      }
  },

参考:

使用 ESlint、lint-staged 半自动提升项目代码质量

eslint+husky+prettier+lint-staged提升前端应用质量

多目录husky配置

eslint-config-airbnb

hackernoon.com/write-beaut…