ค้นหาแพ็คเกจ npm ที่ไม่ได้ใช้ใน package.json


231

มีวิธีการตรวจสอบว่าคุณมีแพคเกจในไฟล์ package.json ที่ไม่ต้องการอีกต่อไปหรือไม่

ตัวอย่างเช่นเมื่อลองใช้แพคเกจและแสดงความคิดเห็นหรือลบรหัสในภายหลัง แต่ลืมที่จะถอนการติดตั้งฉันก็จบลงด้วยแพ็กเกจคู่ที่สามารถลบได้

อะไรจะเป็นวิธีที่มีประสิทธิภาพในการพิจารณาว่าแพ็คเกจสามารถลบได้อย่างปลอดภัยหรือไม่?

คำตอบ:


258

คุณสามารถใช้โมดูล npm ที่เรียกว่าdepcheck (ต้องมีอย่างน้อย 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 ตรวจสอบ

ตรวจสอบการอ้างอิงที่ล้าสมัยไม่ถูกต้องและไม่ได้ใช้

ป้อนคำอธิบายรูปภาพที่นี่

มันค่อนข้างทรงพลังและพัฒนาอย่างแข็งขัน หนึ่งในคุณสมบัติของมันคือการตรวจสอบการพึ่งพาที่ไม่ได้ใช้ - ส่วนนี้ใช้depcheckโมดูลที่กล่าวถึงในคำตอบอื่น ๆ


8
ดูเหมือนว่าจะให้ผลลัพธ์เช่นเดียวกับ depcheck ให้ฉัน ดูเหมือนว่าจะใช้การตรวจสอบความถูกต้องเพื่อค้นหาการขึ้นต่อกันที่ไม่ได้ใช้
Alex K

3
npm outdatedตรวจสอบและแสดงเวอร์ชันแพ็คเกจปัจจุบันและที่ต้องการล่าสุด ไม่มีรายการแพคเกจที่ไม่ได้ใช้
mgarde

1
ดูไม่เป็นประโยชน์เช่นกัน ฉันใช้การตั้งค่าเชิงมุมมาตรฐานและนี่ยังแสดงรายการแพคเกจที่ไม่ได้ใช้ซึ่งผิดเหมือนกัน
Kyle Burkett

5

หากคุณใช้ Unix เช่น OS (Linux, OSX ฯลฯ ) คุณสามารถใช้การรวมกันของfindและegrepเพื่อค้นหาคำสั่งที่ต้องการที่มีชื่อแพ็คเกจของคุณ:

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.jsonเป็นเพียง JSON สิ่งนี้สามารถแก้ไขได้โดยการเขียนสคริปต์ขนาดเล็กที่ใช้child_process.execในการเรียกใช้คำสั่งนี้สำหรับการพึ่งพาแต่ละครั้ง และทำให้เป็นโมดูล และเพิ่มลงใน repo NPM ...


สิ่งที่เกี่ยวกับ.jsxไฟล์และ.tsไฟล์อื่น ๆ : D
OZZIE

1
เห็นได้ชัดว่าใช้วิธีการนี้เราไม่ได้ใช้โมดูลตอบสนองในแอป React ของเรา: D
OZZIE

4

fiskeben wrote:

ข้อเสียคือมันไม่ได้ทำงานโดยอัตโนมัตินั่นคือไม่ได้แยกชื่อแพ็คเกจจาก 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_modulesและbuildโฟลเดอร์ (หรือสิ่งที่คุณต้องการ) บรรทัดที่สามมีส่วนขยายที่อนุญาตคุณสามารถเพิ่มเพิ่มเติมได้ที่นี่เช่นไฟล์ JSX หรือ JSON

ฟังก์ชั่นจะอ่านประเภทพึ่งพา

ครั้งแรกมันcats package.jsonจากนั้นjqรับกลุ่มพึ่งพาที่จำเป็น ( {} +มีเพื่อที่จะไม่เกิดข้อผิดพลาดหากเช่นไม่มีการพึ่งพาเพื่อนในไฟล์)

หลังจากนั้นsedแยกส่วนระหว่างเครื่องหมายคำพูดชื่อแพคเกจ -nและ.../pบอกให้พิมพ์ส่วนที่ตรงกันและไม่มีอะไรอื่นจากjqเอาท์พุท JSON ของ จากนั้นเราอ่านรายชื่อแพคเกจนี้ลงในwhileลูป

RESคือจำนวนครั้งของชื่อแพ็กเกจในเครื่องหมายคำพูด ตอนนี้ก็import/ require... /'package' "package"มันทำงานได้สำหรับกรณีส่วนใหญ่

จากนั้นเราก็นับจำนวนบรรทัดผลลัพธ์จากนั้นพิมพ์ผลลัพธ์

คำเตือน:

  • จะไม่ค้นหาไฟล์ในการนำเข้าที่แตกต่างกันเช่นtsconfig.jsonไฟล์ ( libตัวเลือก)
  • คุณต้องgrepด้วยตนเองสำหรับไฟล์^USEDและเท่านั้นUNUSED
  • มันช้าสำหรับโครงการขนาดใหญ่ - เชลล์สคริปต์มักจะขยายขนาดไม่ได้ แต่หวังว่าคุณจะไม่ทำงานหลายครั้ง

1
บรรณาธิการบางครั้งทำให้การนำเข้าห่อหลายบรรทัด สคริปต์นี้จะตรวจจับข้อความที่ 'นำเข้า' หรือ 'ต้องการ' จะอยู่ในบรรทัดที่แตกต่างจาก 'จาก' PACKAGE_NAME '' หรือไม่ กล่าวอีกนัยหนึ่งมันละเว้นช่องว่างในการนำเข้าหรือต้องการข้อความสั่งหรือไม่
vdiaz1130


1

คำตอบมากมายที่นี่เป็นวิธีการค้นหารายการที่ไม่ได้ใช้

ผมอยากจะลบออกโดยอัตโนมัติ

  1. ติดตั้งโครงการโหนดนี้

    $ npm install -g typescript tslint tslint-etc


  1. ที่ root dir ให้เพิ่มไฟล์ใหม่ 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.