Typescript 中使用 ESLint 和 Prettier

一、概述:

  • 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。
  • 同样在 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 的影响。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容