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

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

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

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



답변

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

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

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

    depcheck

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

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

npx depcheck


답변

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

npm-check

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

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

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


답변

당신은 다음의 조합을 사용할 수 있습니다 (등 리눅스, 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 저장소에 추가하십시오 …


답변

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파일.
  • 대규모 프로젝트의 경우 속도가 느립니다. 셸 스크립트는 종종 확장 성이 떨어집니다. 그러나 희망적으로 당신은 이것을 여러 번 실행하지 않을 것입니다.

답변

이 목적으로 아래 npm 모듈을 사용할 수 있습니다.

https://www.npmjs.com/package/npm-check-unused


답변

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

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

  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 .


답변