programing

패키지에서 사용되지 않는 npm 패키지를 찾습니다.제이손

instargram 2023. 7. 1. 08:01
반응형

패키지에서 사용되지 않는 npm 패키지를 찾습니다.제이손

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

예를 들어, 패키지를 사용해 보고 나중에 코드에 주석을 달거나 삭제했지만 제거하는 것을 잊어버린 경우 삭제할 수 있는 패키지가 몇 개 있습니다.

패키지가 안전하게 삭제될 수 있는지 여부를 결정하는 효율적인 방법은 무엇입니까?

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

  1. 모듈을 설치합니다.

     npm install depcheck -g
    
     or
    
     yarn global add depcheck
    
  2. 이를 실행하여 사용되지 않는 종속성을 찾습니다.

     depcheck
    

이 접근 방식의 좋은 점은 기억할 필요가 없다는 것입니다.find또는grep지휘권

설치하지 않고 실행하려면 사용npx:

npx depcheck 

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

npm 체크

오래된 종속성, 잘못된 종속성 및 사용되지 않는 종속성을 확인합니다.

enter image description here

그것은 꽤 강력하고 활발하게 개발되었습니다.그 중 하나는 사용되지 않는 종속성을 확인하는 기능입니다. 이 부분에 대해서는 다른 답변에 언급된 모듈을 사용합니다.

사용되지 않은 종속성 확인

npm install depcheck -g
depcheck

enter image description here

오래된 라이브러리 확인

npm outdated

enter image description here

여기서 많은 답은 사용하지 않는 항목만 찾는 방법입니다.

만약..나는...

자동으로 -- a) 찾기 + b) 사용하지 않는 항목 제거

아래의 옵션 2가 새로운 방법인 것 같습니다.


옵션 1:

  1. 이 노드 프로젝트를 설치합니다.
 $ npm install -g typescript tslint tslint-etc

  1. 루트 dir에서 새 파일 tslint-imports.json을 추가합니다.
{
  "extends": [
    "tslint-etc"
  ],
  "rules": {
    "no-unused-declaration": true
  }
}

  1. 자신의 책임 하에 이를 실행하고, 백업을 만듭니다 :)
$ tslint --config tslint-imports.json --fix --project .

옵션 2: Per @Alex & @JacopKane 제안, 감사합니다.

// newer one line option
npx depcheck --json | jq '.dependencies[]' | xargs -L1 npm rm

// or
npm uninstall $(npx depcheck --oneline)

gombosg의 스크립트는 npm-check보다 훨씬 좋습니다.
조금 수정했으므로 node_modules의 dev 의존성도 발견될 것입니다.
sass적은 , 에서 필요합니다.sass-loader

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

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

# use fd
# https://github.com/sharkdp/fd

function check {
    cat package.json \
        | jq "{} + .$1 | keys" \
        | sed -n 's/.*"\(.*\)".*/\1/p' > $PACKAGES
    echo "--------------------------"
    echo "Checking $1..."
    fd '(js|ts|json)$' -t f > $FILES
    while read PACKAGE
    do
        if [ -d "node_modules/${PACKAGE}" ]; then
            fd  -t f '(js|ts|json)$' node_modules/${PACKAGE} >> $FILES
        fi
        RES=$(cat $FILES | xargs -I {} egrep -i "(import|require|loader|plugins|${PACKAGE}).*['\"](${PACKAGE}|.?\d+)[\"']" '{}' | 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"

원본 스크립트를 사용한 결과:

--------------------------
Checking dependencies...
UNUSED           jquery
--------------------------
Checking devDependencies...
UNUSED           @types/jquery
UNUSED           @types/jqueryui
USED (1)         autoprefixer
USED (1)         awesome-typescript-loader
USED (1)         cache-loader
USED (1)         css-loader
USED (1)         d3
USED (1)         mini-css-extract-plugin
USED (1)         postcss-loader
UNUSED           sass
USED (1)         sass-loader
USED (1)         terser-webpack-plugin
UNUSED           typescript
UNUSED           webpack
UNUSED           webpack-cli
USED (1)         webpack-fix-style-only-entries

수정된 내용:

Checking dependencies...
USED (5)         jquery
--------------------------
Checking devDependencies...
UNUSED           @types/jquery
UNUSED           @types/jqueryui
USED (1)         autoprefixer
USED (1)         awesome-typescript-loader
USED (1)         cache-loader
USED (1)         css-loader
USED (2)         d3
USED (1)         mini-css-extract-plugin
USED (1)         postcss-loader
USED (3)         sass
USED (1)         sass-loader
USED (1)         terser-webpack-plugin
USED (16)        typescript
USED (16)        webpack
USED (2)         webpack-cli
USED (2)         webpack-fix-style-only-entries

피스케벤은 다음과 같이 썼습니다.

단점은 패키지에서 패키지 이름을 추출하지 않는다는 것입니다.json과 그들을 확인합니다.각 패키지에 대해 직접 이 작업을 수행해야 합니다.

depcheck제대로 작동하지 않습니다! (예: Typescript로 시도해보니 불필요한 구문 분석 오류가 발생했습니다.)

package.json우리는 소프트웨어를 사용할 수 있습니다.아래 셸 스크립트를 시작하려면 디렉터리 이름이 필요합니다.

#!/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_modules그리고.build폴더(또는 원하는 대로)를 선택할 수 있습니다.세 번째 줄에는 허용된 확장자가 포함되어 있습니다. 여기에 JSX 또는 JSON 파일과 같은 파일을 추가할 수 있습니다.

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

은 ㅠㅠ!catpackage.json.그리고나서,jq필요한 종속성 그룹을 가져옵니다.({} +예를 들어 파일에 피어 종속성이 없는 경우 오류를 발생시키지 않도록 하기 위한 것입니다.)

다음에 그이로후.sed따옴표 사이의 부품, 즉 패키지 이름을 추출합니다. -n그리고..../p합니다.jq의 JSON 출력. 다음 는 이 목록을 다우이패이목름읽습다니록을그지런키음리는으로 .while 루우프

RES따옴표로 묶은 패키지 이름의 발생 횟수입니다.지은금입니다.import/require...'package'/"package"대부분의 경우에 효과가 있습니다.

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

주의사항:

  • 수 다가져기파찾일을수없다습니).tsconfig.json파일)lib옵션)
  • 당신은 해야 합니다.grep에한해수동 ▁only로으에 한해 ^USED그리고.UNUSEDfiles 파일
  • 대규모 프로젝트의 경우 속도가 느립니다. 셸 스크립트의 확장성이 좋지 않은 경우가 많습니다.하지만 바라건대 당신은 이렇게 많이 뛰지 않을 것입니다.

계열 OS(리눅스, OSX 등)를 할 수 .find그리고.egrep패키지 이름이 포함된 요구 사항을 검색하려면 다음을 수행합니다.

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

▁▁for경 전체를 하면,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.json 뿐입니다. JSON을 하는 작은 할 수 . 이것은 다음을 사용하는 작은 스크립트를 작성하여 해결할 수 있습니다.child_process.exec각 종속성에 대해 이 명령을 실행합니다.그리고 그것을 모듈로 만듭니다.그리고 NPM 레포에 추가...

사용되지 않는 종속성, 라이브러리 및 가져오지 않은 파일 확인

 npx unimported 

Yarn 2.x 이상에서는 다음을 사용합니다.

yarn dlx depcheck

yarn dlx는 yarn 1.x와 함께 글로벌 패키지로 설치되었을 수 있는 스크립트 중 하나를 실행하도록 설계되었습니다. 시스템 전체 패키지 관리는 yarn의 범위 밖에 있습니다.이를 반영하여 yarn global이 제거되었습니다.

출처: https://yarnpkg.com/getting-started/migration#use-yarn-dlx-instead-of-yarn-global

이를 위해 아래의 npm 모듈을 사용할 수 있습니다.

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

곰보nMo의 대본에 대해 제가 오해한 것이 아니라면요.nMo 스크립트 확장의 더 빠른 버전은 기본값이 'find'이지만 찾기 기능을 위해 'fd'를 사용하도록 쉽게 수정할 수 있습니다.

변경 사항은 먼저 모든 관련 파일을 찾은 다음 파일별 기반이 아닌 한 번에 모든 관련 파일에서 grep 패키지를 찾는 것입니다.

동시성은 제어할 수 있으며 기본값은 8입니다.

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

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

export NUMCONCURRENT=8

function findCmd {
  startPath=${1:-.}
  find "$startPath" \
    -path ./node_modules -prune -or \
    -path ./build -prune -or \
    \( -name "*.ts" -or -name "*.js" -or -name "*.json" \) -print
}

# use fd
# https://github.com/sharkdp/fd
function findCmd_fd {
  startPath=${1:-.}
  fd  -t f '(js|ts|json)$' "$startPath"
}



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

    findCmd > "$FILES"
    while read PACKAGE
    do
        #echo "node_modules/${PACKAGE}"
        if [ -d "node_modules/${PACKAGE}" ]; then
                findCmd node_modules/${PACKAGE} >> $FILES
        fi
    done < $PACKAGES
    export FILES
    export SQ="'"
    xargs -P ${NUMCONCURRENT:-1} -r -a  "$PACKAGES" -I[] bash -c '
        PACKAGE="[]"

        RES=$(cat "$FILES" | xargs -r egrep -i "(import|require|loader|plugins|${PACKAGE}).*[\"${SQ}](${PACKAGE}|.?\d+)[\"${SQ}]" | wc -l)

        if [ $RES = 0 ]
        then
            echo -e "UNUSED\t\t $PACKAGE"
        else
            echo -e "USED ($RES)\t $PACKAGE"
        fi
    '
    [ -f  "$PACKAGES" ] && rm "$PACKAGES"
    [ -f  "$FILES" ] && rm "$FILES"
}

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

만약 당신이 어떤 거인의 어깨 위에 설 것인지를 선택하고 싶다면,

npm에서 사용할 수 있는 옵션의 짧은 목록을 생성하는 링크가 있습니다. 이 링크는 키워드를 필터링합니다.unused packages

https://www.npmjs.com/search?q=unused%20packages

왜 내 대답은 링크에 불과합니까?

일반적으로 링크만 제공하지 않습니다.이 질문은 시간에 덜 민감한 답변을 받을 가치가 있습니다.이 솔루션은 최신 소프트웨어에 의존합니다.유지 관리가 중단되었을 수 있는 특정 소프트웨어를 권장하는 것은 거의 도움이 되지 않습니다(여기 권장 사항 중 일부의 경우).사람들이 최신 정보를 찾을 수 있도록 돕는 것이 적절해 보입니다.

패키지 unused-package(https://www.npmjs.com/package/unused-package) 를 만들었습니다. 이 패키지는 사용되지 않은 패키지를 반환하거나 패키지가 devDependency이지만 일반적인 종속성으로 설치된 경우)

파일을 만들고 이 코드를 파일에 추가합니다.

const check = require("unused-package");

check({ entries: ['entry path to your code'] }).then((res) => {
  console.log(res) // list of packages returned by library
});

used-package는 used-package와 비교하여 used-package의 장점 중 하나로, 패키지는 여러 엔트리 경로를 지원합니다.

언급URL : https://stackoverflow.com/questions/22675725/find-unused-npm-packages-in-package-json

반응형