Knip으로 불필요한 코드 제거하기
들어가며
프로젝트를 진행하다 보면, 불필요한 코드가 남아 있는 상황을 종종 발견하게 됩니다. 이러한 코드를 일일이 찾아서 제거할 수도 있지만, 규모가 큰 프로젝트에서는 시간이 많이 소요될 수 밖에 없습니다.
게다가 만약 중복되는 불필요한 코드가 여러 파일에 걸쳐 흩어져 있다면, 이를 전부 수동으로 정리하는 것은 굉장히 비효율적이며 수고로운 일입니다.
이러한 문제를 효과적으로 해결할 수 있는 도구가 바로 Knip입니다.
Knip이란?
knip의 공식문서를 보면 다음과 같이 knip을 소개하고 있습니다.
Knip finds and fixes unused files, exports and dependencies.
Knip은 프로젝트에서 다음과 같은 불필요한 요소들을 자동으로 찾아주는 정적 분석 도구입니다:
- 사용되지 않는 파일: 프로젝트 어디에서도 import되지 않는 파일들
- 사용되지 않는 exports: 선언은 되어있지만 어디에서도 사용되지 않는 함수나 변수
- 불필요한 dependencies: package.json에 있지만 실제로 사용되지 않는 패키지들
- 중복된 exports: 여러 파일에서 동일한 이름으로 export되는 요소들
- 사용되지 않는 타입: TypeScript에서 선언되었지만 사용되지 않는 타입들
이러한 기능을 통해 코드베이스를 깔끔하게 유지하고 번들 크기를 최적화할 수 있습니다.
Knip 사용하기
설치 및 기본 설정
우선 아래 명령어를 통해 knip을 개발 의존성으로 설치합니다:
npm install knip -D설치 후 package.json의 scripts에 knip 명령어를 추가합니다:
{
"scripts": {
"knip": "knip"
}
}이제 다음 명령어로 Knip을 실행할 수 있습니다:
npm run knip분석 결과 이해하기
Knip을 실행하면 다음과 같은 카테고리별 결과를 확인할 수 있습니다:
Unused files (100)
# 프로젝트에서 사용되지 않는 파일들
Unused dependencies (6)
# package.json에 있지만 사용되지 않는 패키지들
Unused devDependencies (2)
# 개발 의존성 중 사용되지 않는 패키지들
Unlisted binaries (3)
# package.json에 명시되지 않은 실행 파일들
Unused exports (213)
# export 했지만 사용되지 않는 요소들
Unused exported types (244)
# 사용되지 않는 TypeScript 타입들
Unused exported enum members (86)
# 사용되지 않는 enum 멤버들
Duplicate exports (17)
# 중복 export된 요소들각 Issue Type에 대한 자세한 설명은 공식문서에서 확인할 수 있습니다.
세부 설정하기
프로젝트의 필요에 따라 특정 파일이나 경로만 검사하거나, 특정 유형의 이슈만 확인하고 싶을 수 있습니다. 이런 경우 knip.json 설정 파일을 활용할 수 있습니다.
예를 들어, 사용되지 않는 파일만 검사하려면:
// knip.json
{
"include": ["files"]
}특정 디렉토리만 검사하려면:
// knip.json
{
"project": ["src/apis/**"],
"ignore": ["**/*.test.ts", "**/*.spec.ts"] // 테스트 파일 제외
}CLI에서 직접 옵션을 지정할 수도 있습니다:
npx knip --include files
npx knip --project "src/apis/**"husky와 함께 사용하기
Knip을 통해서 주기적으로 불필요한 코드를 찾고 제거해줄 수도 있겠지만, Husky와 같은 Git Hook 도구와 함께 사용해서 의도치 않게 불필요한 코드가 원격 저장소에 올라가는 것을 미리 방지할 수도 있습니다.
아래와 같이 pre-push hook에 Knip 명령어를 추가하면 원격 저장소에 push 하기 전에 knip이 실행되고, 불필요한 코드가 있다면 push가 되지 않기 때문에 사전에 불필요한 코드가 원격 저장소에 올라가는 것을 막을 수 있습니다.
# .husky/pre-push
npx knip마치며
개발 과정에서 불필요한 코드가 쌓이는 것은 프로젝트를 무겁게 만들 뿐 아니라 히스토리를 알기 어려운 코드가 생길 수 있기 때문에 전반적으로 개발 부채를 야기합니다.
하지만 knip을 사용해서 불필요한 코드를 제거할 수 있으며 이를 통해 개발 부채가 쌓이는 것을 막을 수 있습니다.
실제로 knip을 사용해서 많은 사용되지 않는 많은 코드를 제거할 수 있었고 이를 통해 최종 번들 사이즈와 빌드 시간도 줄일 수 있었습니다.