logo

TSLint에서 ESLint로

2019년을 끝으로 TSLint 개발은 끝난다.

typescript, tslint, eslint


TSLint는 2019년이 끝

TSLint will be deprecated some time in 2019.

올해 초부터 공표했듯이 TSLint는 2019년을 끝으로 더는 사용되지 않는다. 마이그레이션은 꽤 귀찮은 일이지만 피할 수 없기에 12월이 되었으니 다시금 ESLint로 돌아가야 할 때가 된 것 같다.

tslint-to-eslint-config를 사용하면 마이그레이션을 할 수 있지만, 어차피 설정을 조금이라도 고쳐야 하고 한동안 안 써서 혹시나 변경되거나 추가된 API가 있을까 봐 TSLint를 지우고 ESLint를 설치했다.

Migration

먼저 TSLint 설정파일과 TSLint와 관련된 패키지는 모두 삭제 후 ESLint를 설치한다.

다음으로 ESLint 설정파일을 생성해주는 커맨드를 실행한다.

$ npm install -g eslint
$ eslint --init

VSCode를 주로 사용하는지라 IDE에서 linting 하려면 전역으로 설치해야 한다.

만약 프로젝트에서 실행하려면 아래와 같이 설치 후 실행하면 된다.

$ npm install --save-dev eslint
$ ./node_modules/.bin/eslint --init

그것도 아니라면 일회성으로 전역에서 실행시켜주는 npx를 사용하면 된다.

$ npx eslint --init

여러 질문을 거쳐 입맛에 맞게 생성된 초기 설정은 아래와 같다. (eslint 6.7.2)

{
  "env": {
    "browser": true,
    "es6": true
  },
  "extends": [
    "plugin:react/recommended",
    "airbnb"
  ],
  "globals": {
    "Atomics": "readonly",
    "SharedArrayBuffer": "readonly"
  },
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "ecmaFeatures": {
      "jsx": true
    },
    "ecmaVersion": 2018,
    "sourceType": "module"
  },
  "plugins": [
    "react",
    "@typescript-eslint"
  ],
  "rules": {
  }
}

과정의 마지막에 관련 패키지 설치를 묻는데 설치하도록 하자.

하지만 prettier는 포함이 안 되어 있는 관계로 prettier와 eslint를 위한 패키지들을 설치 후

$ npm install --save-dev prettier eslint-config-prettier eslint-plugin-prettier

아래 설정을 추가하면 된다.

{
  ...
  "extends": [
    ...
    "prettier/@typescript-eslint",
    "plugin:prettier/recommended"
  ],
  ...
}

ESLint

여기까지 한 뒤 파일을 linting 해보니 난리가 나 있었다. 이제부터는 룰을 하나씩 잡아야했었는데 나의 최종 초기값은 아래와 같다.

{
  "env": {
    "browser": true,
    "es6": true
  },
  "extends": [
    "plugin:react/recommended",
    "plugin:@typescript-eslint/recommended",
    "airbnb",
    "plugin:import/errors",
    "plugin:import/warnings",
    "plugin:import/typescript",
    "prettier/@typescript-eslint",
    "plugin:prettier/recommended"
  ],
  "globals": {
    "Atomics": "readonly",
    "SharedArrayBuffer": "readonly"
  },
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "ecmaFeatures": {
      "jsx": true
    },
    "ecmaVersion": 2018,
    "sourceType": "module"
  },
  "plugins": ["react", "@typescript-eslint"],
  "rules": {
    "react/jsx-filename-extension": [
      2,
      { "extensions": [".js", ".jsx", ".ts", ".tsx"] }
    ],
    "react/prop-types": 0,
    "react/state-in-constructor": 0
  }
}

마치며

lint가 필수는 아니지만, 지금까지 lint를 사용함으로써 얻는 장점이 더 크다고 생각한다. 1인 개발이든 팀 개발이든 lint를 사용하여 더욱 높은 가독성과 여러 오류에서 벗어나는 게 좋지 않을까? (물론 다른 의견도 환영)