Knip 와 함께 dead code 정리

May 15, 2025

오랜만에 글을 쓰는 것 같다.
그동안 회사일도 많았지만 사이드 프로젝트로 인해 너무 바빠서 블로그 신경을 못 쓴것 같다.

지금도 시간이 많지 않으니 최근 유용하게 사용한 패키지 하나를 후딱 소개하려 한다.

Knip

Knip

이미 잘 쓰는 사람도 있겠지만 이 패키지의 목적은
Declutter your JavaScript & TypeScript projects
코드 정리를 도와주는 아주 유용한 도구다.

주로 사용하는 lint 나 다른 잡다한 도구로도 어느정도 안쓰는 코드를 정리 할 수 있지만
이 도구는 안쓰는 파일,type,interface,enum 등등 현재 코드에서 죽은 코드를
깔끔하게 알려주기 떄문에 주기적으로 프로젝트 코드를 정리할때 아주 유용하다.

뭐 사용법은 홈페이지에 있으니 자세히 차근차근 보면서 따라하면 되고
나같은 경우 대부분의 프로젝트가 전부 monorepo 형식이기 때문에
이에 맞는 설정을 만들어 사용했다.

간단하게 루트에 knip.config.ts 설정파일을 작성하고

아래 예시처럼

export default { workspaces: { "packages/a-package": { entry: ["src/entry/index.ts"], project: ["src/**/*.{js,ts,tsx}"], }, "packages/b-package": { entry: ["src/entry/index.ts"], project: ["src/**/*.{js,ts,tsx}"], }, }, project: "tsconfig.json", ignoreDependencies: ["@swc/helpers", "react", "react-dom", "core-js"], rules: { binaries: "error", dependencies: "error", devDependencies: "error", exports: "error", files: "warn", nsExports: "error", nsTypes: "error", types: "error", enumMembers: "error", unlisted: "off", }, paths: { "@/*": ["./src/*"], "~/*": ["./src/*"], "src/*": ["./src/*"], }, ignore: [ "**/*.test.{ts,tsx}", "**/*.spec.{ts,tsx}", "**/*.stories.{ts,tsx}", "**/*.d.ts", "**/node_modules/**", "**/dist/**", "**/build/**", "**/storybook-static/**", "**/jest.config.{js,ts}", ], }

실제 설정파일은 훨씬 복잡하지만..
기본 예시로 대략 이렇게 필요한 설정을 계속 추가 하면 된다.

더 많은 설정은 홈페이지에서 확인하면 된다. 🥹

그래서 결과물은?

monorepo 같은 경우 위처럼 workspace 를 설정해서
pnpm knip 이런식으로 한번에 검사하거나,
pnpm knip --workspace packages/a-package 이런식으로 특정 패키지만
검사하는 것도 가능하다.

한번 돌려보면

ff

ff

ff

스샷이 뒤죽박죽인데
하여튼 이런식으로 사용되지 않는 파일이나 함수,변수,interface 등등
현재 프로젝트에서 죽은 코드들을 싹 알려준다.

주의할 점은 위 설정파일에서 있는 entry 배열 기준으로 정리하기 때문에
entry 설정을 정확히 해야 정확한 결과를 가져온다.

module federation 을 사용하는 경우에도 export 하는 파일의 이름,
Barrel 방식 이라면 내보내는 index.ts 를 entry 에 넣어주면
잘 작동한다.

봄이 가고 이제 여름이 시작되니 더 더워지기 전에
코드 청소 한번 하는게 좋지 않을까