개발이 끝나고 난 뒤 되돌아 보니 사용하지 않는 코드들이 생각보다 많아서 이걸 어떻게 해야 하나 고민했었는데 Knip 라이브러리를 알게 되었다.
개발환경
- monorepo 구조
- next v12
- knip v5 사용
knip이란 사용하지 않는 함수, 타입, 패키지 들을 모두 찾아주는 라이브러리이다.
knip을 사용하기 전에 내가 얼마나 많은 불필요한 코드들을 남겨뒀는지를 확인해 보려고 용량을 체크해봤다.
du -sh // 프로젝트 폴더 용량
du -sh .next // 빌드된 폴더 용량
테스트해보는 거기 때문에 라이브러리 설치 없이 바로 실행하는 방법으로 진행했다.
npx knip
이슈타입과 해당되는 파일이름과 해당 파일내에 이슈가 생긴 함수,타입, 패키지 이름이 적혀져 있다.
회사코드여서 혹시 몰라서 자세한 파일명등은 가려뒀다.

이슈타입 정리
| Title | Description | Key |
|---|---|---|
| Unused files | 사용하지 않는 파일 | files |
| Unused dependencies | package.json/ dependency에서 해당 패키지를 사용하는 곳이 없는 경우 | dependencies |
| Unused devDependencies | package.json/ devDependency에서 해당 패키지를 사용하는 곳이 없는 경우 | dependencies |
| Referenced optional peerDependencies | Optional peer dependency is referenced(이해못함) | dependencies |
| Unlisted dependencies | package.json에 나열되지 않은 dependecy를 사용함 | unlisted |
| Unlisted binaries | package.json에 나열되지 않은 Binariy를 사용함 | binaries |
| Unresolved imports | 모듈 혹은 파일의 import를 할 수 없다 | unresolved |
| Unused exports | export한 함수가 사용되지 않는다 | exports |
| Unused exported types | export한 타입이 사용되지 않는다 | types |
| Exports in used namespace | 코드에서 특정 네임스페이스 를 참조하고 있지만, 해당 네임스페이스에서 실제로 export된 내용을 찾을 수 없다 | nsExports |
| Exported types in used namespace | 코드에서 특정 네임스페이스에 있는 타입을 참조하고 있지만, 해당 타입이 실제로 정의되어 있지 않다 | nsTypes |
| Unused exported enum members | enum의 특정 필드는 사용되지 않는다 | enumMembers |
| Unused exported class members | class의 특정 필드는 사용되지 않았다 | classMembers |
| Duplicate exports | export가 중복되었다 | duplicates |
이제 사용하지 않는 존재들을 알았으니 수동으로 직접 지우면 된다
라고 하기엔 솔직히 좀 귀찮았다
그래서 좀 더 편한 방법이 없지 않을까 해서 knip공식문서를 찾아봤더니 Auto-fix 라는 기능이 있었다
Auto-fix는 knip v5기준에서는 실험 기능이다.
실험기능이라고 하니 실험적으로 한번 사용해보았다.
npx knip --fix // 사용하지 않는 export,dependencies만 제거
npx knip --fix --allow-remove-files // 사용하지 않는 파일만 제거
자동수정(--fix)은 아래와 같은 이슈들만 수정한다.
1. 사용하지 않는 함수,타입, export 제거
2. package.json에서 사용하지 않는 dependencies,devDependencies 제거
3. 사용하지 않는 파일 제거
4. 모노레포에서 워크스페이스를 건너서 작동하는 것 (아직 이해 못함)
이외엔 아직 지원하지 않는다.
--fix-type 옵션을 사용하면 특정 이슈타입에 해당하는 경우만 삭제할 수 도 있다
가능한 이슈타입들
아래 예시처럼 사용가능하다
knip --fix-type exports,types
knip --fix-type exports --fix-type types //위아래 같은 실행문이다.
위처럼 내가 필요하다고 생각한 명령어들은 모두 실행시키고 보니 Unlisted dependencies,Unlisted binaries 만 남았다
monorepo특성상 다른 workspace에 있는 패키지를 자유롭게 사용이 가능한대 위 이슈는 현재 workspace의 패키지를 사용하지 않는다는 의미기에 따로 처리를 안하는게 맞다고 생각해서 냅두려고 한다.
그래도 신경쓰이니 특정 이슈는 제외하고 knip을 실행시키는 명령어를 사용하면 된다.
npx knip --exclude unlisted,binaries
그리고 특정 workspace만 실행시키고 싶다면 해당 폴더만 실행하는 명령어를 사용하면 된다
npx knip --workspace {현재폴더 기준 workspace위치 예)packages/intro}
이제 정리된 패키지들도 있을테니 패키지들을 업데이트시켜준다.
yarn or npm install ...
얼마나 많이 지워졌는지 한번 확인해봤더니 나름 효과가 있어보여서 만족스러웠다.
641M -> 615M
637M -> 611M
->26M가 감소했다.
사용하지않는 패키지들도 있었으니 생각보다 많이 줄어든게 보였다!
코드정리 후 꼭 기능들이 전부 제대로 동작하는지 봐야한다!