package.json에서 사용되지 않는 npm 패키지를 찾으십시오.


231

package.json 파일에 더 이상 필요하지 않은 패키지가 있는지 확인하는 방법이 있습니까?

예를 들어 패키지를 시험 해보고 나중에 주석을 달거나 코드를 삭제하지만 제거를 잊어 버린 경우 삭제할 수있는 몇 가지 패키지가 생깁니다.

패키지를 안전하게 삭제할 수 있는지 확인하는 효율적인 방법은 무엇입니까?

답변:


258

depcheck 라는 npm 모듈을 사용할 수 있습니다 (노드 버전 10 이상 필요).

  1. 모듈을 설치하십시오 :

    npm install depcheck -g
    
    or
    
    yarn global add depcheck
  2. 이를 실행하고 사용하지 않는 종속성을 찾으십시오.

    depcheck

이 방법의 좋은 점은 find또는 grep명령 을 기억할 필요가 없다는 것 입니다.

설치하지 않고 실행하려면 npx 사용하십시오.

npx depcheck

11
depcheck-es6가 이제 depcheck에 통합되었습니다
cyberwombat

47
유용하지 않습니다. 표준 angular2 cli 설정을 사용하고 있으며 depcheck모든 패키지 unused가 잘못되었다고 표시합니다
phil294

5
NB. depcheck는 package.json에 지정된 스크립트에 사용 된 패키지를 고려하지 않습니다
Javier Arias

17
한 번만 실행하려면 (설치없이) -npx를 사용 하십시오 .npx depcheck
Kiril

6
나를 위해 작동하지 않았다. 모든 패키지가 사용되지 않은 것으로 표시되었습니다.
dev27

131

다음과 같은 패키지도 있습니다 npm-check.

npm-check

오래되고 부정확하며 사용되지 않는 종속성을 확인하십시오.

여기에 이미지 설명을 입력하십시오

그것은 매우 강력하고 적극적으로 개발되었습니다. 사용되지 않는 종속성을 확인하는 기능 중 하나입니다.이 부분에서는depcheck 다른 답변에서 언급 한 모듈을 .


8
depcheck와 동일한 결과를 제공하는 것 같습니다. 심지어 사용되지 않는 종속성을 찾기 위해 depcheck를 사용하는 것처럼 보입니다.
Alex K

3
npm outdated현재, 원하는 최신 패키지 버전을 확인하고 나열합니다. 사용되지 않은 패키지 목록은 없습니다.
mgarde

1
유용하게 보이지 않습니다. 나는 표준 각도 설정을 사용하고 있으며 이것은 또한 모든 패키지를 사용되지 않은 것으로 나열합니다
Kyle Burkett

5

당신은 다음의 조합을 사용할 수 있습니다 (등 리눅스, OSX) OS와 같은 유닉스를 사용하는 경우 findegrep패키지 이름을 포함하는 문을 필요로를 검색 :

find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni 'name-of-package' {} \;

전체 require('name-of-package')문장 을 검색 하는 경우 올바른 유형의 따옴표를 사용해야합니다.

find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni 'require("name-of-package")' {} \;

또는

find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni "require('name-of-package')" {} \;

단점은 완전 자동적이지 않다는 package.json것입니다. 즉, 패키지 이름을 추출 하여 확인 하지 않습니다 . 각 패키지마다이 작업을 수행해야합니다. package.jsonJSON 이므로 child_process.exec각 종속성에 대해이 명령을 실행 하는 데 사용되는 작은 스크립트를 작성하여이를 해결할 수 있습니다 . 그리고 그것을 모듈로 만드십시오. 그리고 NPM 저장소에 추가하십시오 ...


.jsx파일과 .ts파일 등 은 어떻습니까 : D
OZZIE

1
분명히이 접근법을 사용하여 우리는 React 앱에서 반응 모듈을 사용하지 않습니다 : D
OZZIE

4

fiskeben은 다음과 같이 썼습니다.

단점은 완전 자동적이지 않다는 것입니다. 즉 package.json에서 패키지 이름을 추출하여 확인하지 않습니다. 각 패키지마다이 작업을 수행해야합니다.

어떤 이유로 든 Fiskeben의 답변을 자동화하십시오 depcheck 제대로 작동하지 않는 ! (예를 들어 Typescript로 시도했지만 불필요한 구문 분석 오류가 발생했습니다)

구문 분석 package.json을 위해 소프트웨어를 사용할 수 있습니다 jq. 아래 셸 스크립트에는 시작할 디렉토리 이름이 필요합니다.

#!/bin/bash
DIRNAME=${1:-.}
cd $DIRNAME

FILES=$(mktemp)
PACKAGES=$(mktemp)

find . \
    -path ./node_modules -prune -or \
    -path ./build -prune -or \
    \( -name "*.ts" -or -name "*.js" -or -name "*.json" \) -print > $FILES

function check {
    cat package.json \
        | jq "{} + .$1 | keys" \
        | sed -n 's/.*"\(.*\)".*/\1/p' > $PACKAGES

    echo "--------------------------"
    echo "Checking $1..."
    while read PACKAGE
    do
        RES=$(cat $FILES | xargs -I {} egrep -i "(import|require).*['\"]$PACKAGE[\"']" '{}' | wc -l)
        if [ $RES = 0 ]
        then
            echo -e "UNUSED\t\t $PACKAGE"
        else
            echo -e "USED ($RES)\t $PACKAGE"
        fi
    done < $PACKAGES
}

check "dependencies"
check "devDependencies"
check "peerDependencies"

먼저 패키지 이름과 파일을 캐시 할 수있는 두 개의 임시 파일을 만듭니다.

find명령으로 시작합니다 . 그것을 무시 첫 번째와 두 번째 라인 만드는 node_modulesbuild 폴더 (또는 원하는 항목)를 . 세 번째 줄에는 허용 된 확장자가 포함되어 있으며 여기에 JSX 또는 JSON 파일을 더 추가 할 수 있습니다.

함수는 종속 유형을 읽습니다.

첫째는 cat의 S package.json. 그런 다음 jq필요한 종속성 그룹을 가져옵니다. ( {} +예 : 파일에 피어 종속성이없는 경우 오류가 발생하지 않도록하십시오.)

그런 sed다음 패키지 이름 인 따옴표 사이의 부분을 추출합니다. -n.../p일치하는 부품에서 아무것도 인쇄를 지시 jq의 JSON 출력을. 그런 다음이 패키지 이름 목록을 while루프 로 읽습니다 .

RES패키지 이름이 따옴표로 표시되는 횟수입니다. 지금 당장이야 import/ require... 'package'/"package" 입니다. 대부분의 경우 작업을 수행합니다.

그런 다음 결과 줄 수를 세고 결과를 인쇄합니다.

주의 사항 :

  • 다른 가져 오기에서 파일을 찾을 수 없습니다 tsconfig.json( 예 : 파일 lib)
  • 당신은에있는 grep경우에만 수동 ^USEDUNUSED파일.
  • 대규모 프로젝트의 경우 속도가 느립니다. 셸 스크립트는 종종 확장 성이 떨어집니다. 그러나 희망적으로 당신은 이것을 여러 번 실행하지 않을 것입니다.

1
편집기로 인해 가져 오기가 여러 줄로 줄 바꿈되는 경우가 있습니다. 이 스크립트는 'import'또는 'require'가 'from'PACKAGE_NAME ''과 다른 줄에있는 문장을 포착합니까? 즉, 가져 오기에서 공백을 무시하거나 명령문을 요구합니까?
vdiaz1130


1

여기에 많은 대답이 사용되지 않은 항목을 찾는 방법입니다.

나는 그들을 자동으로 제거하고 싶었다 .

  1. 이 노드 프로젝트를 설치하십시오.

    $ npm install -g typescript tslint tslint-etc


  1. 루트 디렉토리에서 새 파일 tslint-imports.json을 추가하십시오.

    { "extends": [ "tslint-etc" ], "rules": { "no-unused-declaration": true } }


  1. 위험 부담으로 실행하고 백업하십시오 :)

    $ tslint --config tslint-imports.json --fix --project .


그러나 이것은 js 파일에서만 제거됩니다. 그래도 여전히 좋아
Ayon Nahiyan

어떻 npx depcheck --json | jq '.dependencies[]' | xargs -L1 npm rm
alex
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.