Knip을 이용해서 사용하지 않는 코드 정리

WooJu·2024년 7월 25일

개발

목록 보기
3/12

배경


개발이 끝나고 난 뒤 되돌아 보니 사용하지 않는 코드들이 생각보다 많아서 이걸 어떻게 해야 하나 고민했었는데 Knip 라이브러리를 알게 되었다.

개발환경

  • monorepo 구조
  • next v12
  • knip v5 사용

Knip


knip이란 사용하지 않는 함수, 타입, 패키지 들을 모두 찾아주는 라이브러리이다.

용량체크


knip을 사용하기 전에 내가 얼마나 많은 불필요한 코드들을 남겨뒀는지를 확인해 보려고 용량을 체크해봤다.

du -sh			// 프로젝트 폴더 용량
du -sh .next	// 빌드된 폴더 용량

실행


테스트해보는 거기 때문에 라이브러리 설치 없이 바로 실행하는 방법으로 진행했다.

npx knip

실행결과


이슈타입과 해당되는 파일이름과 해당 파일내에 이슈가 생긴 함수,타입, 패키지 이름이 적혀져 있다.
회사코드여서 혹시 몰라서 자세한 파일명등은 가려뒀다.

이슈타입 정리

TitleDescriptionKey
Unused files사용하지 않는 파일files
Unused dependenciespackage.json/ dependency에서 해당 패키지를 사용하는 곳이 없는 경우dependencies
Unused devDependenciespackage.json/ devDependency에서 해당 패키지를 사용하는 곳이 없는 경우dependencies
Referenced optional peerDependenciesOptional peer dependency is referenced(이해못함)dependencies
Unlisted dependenciespackage.json에 나열되지 않은 dependecy를 사용함unlisted
Unlisted binariespackage.json에 나열되지 않은 Binariy를 사용함binaries
Unresolved imports모듈 혹은 파일의 import를 할 수 없다unresolved
Unused exportsexport한 함수가 사용되지 않는다exports
Unused exported typesexport한 타입이 사용되지 않는다types
Exports in used namespace코드에서 특정 네임스페이스 를 참조하고 있지만, 해당 네임스페이스에서 실제로 export된 내용을 찾을 수 없다nsExports
Exported types in used namespace코드에서 특정 네임스페이스에 있는 타입을 참조하고 있지만, 해당 타입이 실제로 정의되어 있지 않다nsTypes
Unused exported enum membersenum의 특정 필드는 사용되지 않는다enumMembers
Unused exported class membersclass의 특정 필드는 사용되지 않았다classMembers
Duplicate exportsexport가 중복되었다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 옵션을 사용하면 특정 이슈타입에 해당하는 경우만 삭제할 수 도 있다
가능한 이슈타입들

  • files
  • exports
  • types
  • dependencies

아래 예시처럼 사용가능하다

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가 감소했다.
사용하지않는 패키지들도 있었으니 생각보다 많이 줄어든게 보였다!


주의


코드정리 후 꼭 기능들이 전부 제대로 동작하는지 봐야한다!

profile
모르는게 너무 많아

0개의 댓글