TSLint 에서 ESLint 로 이사하기

박성룡 ( Andrew park )
8 min readNov 17, 2019

--

TSLint 를 ESLint 로 이사하는 와중 배운 바를 정리해보고자 한다.

동료들과 작업을 할때 주로 Typescript 를 사용하고 있다.

동료들이 읽기 좋은 코드를 위해 코드 컨벤션을 맞출 필요가 있었는데, 자연스럽게 TSLint 와 Prettier 를 도입하게 되었다.

TSLint 는 TypeScript 코드 를 가독성 및 오류를 미리 검사하는 정적 분석 도구이다.

Prettier 는 분석된 도구를 이용해서 정해놓은 규칙에 맞게 자동으로 정렬해서 가독성을 높이고 코드 스타일을 통일할 수 있다.

Webstom 이나 VSCode 에서 TSLint 와 Prettier 가 Plugin 형태로 지원되기 때문에, 해당 도구를 이용해서 쉽게 작업 할 수 있다.

그런데 TSLint 가 2019 년부터 업데이트가 중단된 소식을 듣게 되었다.

https://github.com/palantir/tslint/issues/4534

중단한 이유는 관련 블로그 를 통해 자세히 설명하고 있다.

Typescript 는 순수 Javascript 로 작업 하여도 문제가 없을 정도의 호환성을 보장한다.

하지만 TSLint 는 순수 Javascript 코드를 Linting 하는데, ESLint 보다 효과적이 못한다고 한다.

때문에 기존에 사용하던, TSLint 를 ESLint 로 변환을 시도하게 되었다.

TSLint 에서 ESLint 로 마이그레이션 삽질

tslint-to-eslint-config 를 이용하면 ESLint 로 바로 마이그레이션 할 수 있다.

npx tslint-to-eslint-config

tslint-to-eslint-config 를 사용 하려면, node_module 에 typescript 와 tslint 이 설치되어 있어야 한다.

tslint-to-eslint-config 는 TSLint 와 TSConfig 파일을 읽어, 이를 .eslintrc.js 로 변환한다.

.eslintrc.js 는 ESLint 에서 사용하는 설정 파일이다.

npm install --save-dev eslint
./node_modules/.bin/eslint index.ts

변환된 설정으로, ESLint 를 실행하면 에러가 나오는데, eslint 에서 typescript 를 사용하기 위한 몇가지 툴이 필요하다.

npm install @typescript-eslint/parser @typescript-eslint/eslint-plugin --save-dev

@typescript-eslint/parser 는 typescript 를 파싱하기 위해 쓰인다.

@typescript-eslint/tslint 는 여러 rule 들을 사용할 수 있다.

typescript-eslint 로 모든 기능들이 변환된것이 아니므로, tslint-to-eslint-config 로 변환된 파일의 rule 에는 문제가 있을만한 rule 이 추가되어 있을 수 있으므로 일부 커스텀이 필요하다.

지원하는 옵션들은 다음과 같다.

https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/ROADMAP.md

Webstrom 에 세팅하기

Webstorm 에는 ESLint 가 이미 포함되어 있다.

Webstorm > Preferences > Plugins > ESLint 를 설치할 수 있다.

설치후 재실행하면, ESLint Setting 가 추가된다.

아래 내용 세팅 하면 된다.

  • Node interpreter 에 로컬의 Node 를 연결한다
  • Path to eslint bint 에 현재 프로젝트의 eslint 인 ./node_modules/.bin/eslint 를 연결한다.
  • ESLint config file path 에 생성한 .eslintrc.js 를 연결한다.

VSCode 에 세팅하기

VSCode 의 extension 에 ESLint 를 설치할 수 있다.

extension 로 설치한 ESLint 가 typescript 를 읽을 수 있게 settings.json 에 포함시켜야 한다.

// settings.json
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
]
```

@typescript-eslint/parser 와 JS file

만약 .eslintrc.jstscofing.json 을 참조하라고 정의했다면, js 확장자를 가진 파일을 읽을때 에러가 발생할 수 있다.

// .eslintrc.js
"parserOptions": {
"project": "tsconfig.json",
}
```

그럴경우

  • .eslintignore**/*.js 를 넣어 JS 파일을 무시하거나,
  • parserOptions 옵션에서 project 세팅을 해제하거나,
  • parser 를 babel-eslint 로 변경해보는 것을 고려해 볼 수 있다.
// .eslintrc.js
parser: 'babel-eslint',
plugins: ['babel']

마이그레이션 없이 eslint 새로 세팅하기

기존에 쓰던 환경을 그대로 쓰면 좋겠지만, 세팅이 100% 원하는 형태로 나오지 않을 수도 있다.

이럴 경우 옵션을 기존과 동일하게 문서를 보면서 하나씩 다시 맞추거나, 사용하면서 옵션을 추가해 나가는 방법이 있을 수 있다.

연습 삼아 새로 세팅해 보자.

  • npm 으로 eslint 와 typescript 를 설치한다.
  • eslint — init 으로 `.eslintrc.js` 를 세팅한다.
npm init
npm install eslint typescript --save-dev
./node_modules/.bin/eslint --init

eslint 를 세팅할때 typescrip 를 포함한, 여러 옵션들을 선택 할 수 있다.

세팅이 완료되면, 6.6.0 버전 기준으로 아래와 같은 파일이 생성된다.

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

이제 코드를 작성하며, 룰을 원하는 형태로 추가하면되는데,

이미 많은 사람들이 사용하고 있는, prettier 나 airbnb 코드 스타일을 첨가해보자.

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

설치가 완료되면 .eslintrc.js 에 아래 내용을 추가하기만 하면 끝난다.

// .eslintrc.js
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended"
"prettier/@typescript-eslint",
"plugin:prettier/recommended"
"airbnb-base"
]

이제 간단한 Typescript 코드를 작성하고, 아래 명령어를 실행하면 코드가 자동으로 정리가 되는걸 볼 수 있다.

eslint '**/*.{ts}' --quiet --fix

하지만 명령어를 계속 치는건 귀찮으니, 이를 prettier 를 이용해서 자동으로 정리되게 해보자.

prettier 의 Pre-commit Hook 기능을 이용하면, git commit 이 될때 마다 대상 파일이 자동으로 lint 되게 세팅할 수 있다.

npx mrm lint-staged

위 명령을 실행하면, package.json 까지 자동으로 세팅 해준다.

// package.json
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"*.ts": [
"eslint --fix",
"git add"
]
}

마무리

Lint 는 개발하는데, 필수적인 요소는 아니다.

개인의 코드 스타일을 억제하고, 세팅에 따라 강제로 코드를 바꿔버려 짜증을 유발할 수 도 있다.

하지만 일관된 코드 스타일을 유지하는 것이 미래에 발생할 유지 보수 비용에 비하면 크지 않을 비용이라고 할 수 있을것 같다.

ESLint 로 세팅한 Recommand 는 반드시 지키기 보다는, 본인과 팀에 맞는 코드 스타일을 유지 할 수 있도록, 커뮤니케이션을 잘하고, 이를 적용해 나가는 것이 더욱 중요할 것 같다.

--

--