Tìm các gói npm chưa sử dụng trong pack.json


231

Có cách nào để xác định xem bạn có các gói trong tệp pack.json không còn cần thiết không?

Ví dụ, khi thử một gói và sau đó nhận xét hoặc xóa mã, nhưng quên cài đặt nó, tôi kết thúc với một vài gói có thể bị xóa.

Điều gì sẽ là một cách hiệu quả để xác định nếu một gói có thể bị xóa một cách an toàn?

Câu trả lời:


258

Bạn có thể sử dụng một mô-đun npm được gọi là depcheck (yêu cầu ít nhất là phiên bản 10 của Node).

  1. Cài đặt mô-đun:

    npm install depcheck -g
    
    or
    
    yarn global add depcheck
  2. Chạy nó và tìm các phụ thuộc không sử dụng:

    depcheck

Điểm hay của phương pháp này là bạn không cần phải nhớ findhoặc ra greplệnh.

Để chạy mà không cần cài đặt, sử dụng npx:

npx depcheck

11
depcheck-es6 hiện được hợp nhất thành depcheck
cyberwombat

47
không hữu ích Tôi đang sử dụng thiết lập angular2 cli tiêu chuẩn và depcheckliệt kê mọi gói unusedlà sai
phil294

5
Lưu ý depcheck không đưa vào các gói tài khoản được sử dụng trong các tập lệnh được chỉ định trong gói.json
Javier Arias

17
Để chạy nó chỉ một lần (cài đặt w / o) - sử dụng npx :npx depcheck
Kiril

6
Không làm việc cho tôi. Nó liệt kê tất cả các gói là không sử dụng.
dev27

131

Ngoài ra còn có một gói được gọi là npm-check:

kiểm tra npm

Kiểm tra các phụ thuộc lỗi thời, không chính xác và không sử dụng.

nhập mô tả hình ảnh ở đây

Nó khá mạnh mẽ và tích cực phát triển. Một trong những tính năng của nó là kiểm tra các phụ thuộc không sử dụng - đối với phần này, nó sử dụng depcheckmô-đun được đề cập trong câu trả lời khác.


8
Có vẻ như cho tôi kết quả tương tự như depcheck. Có vẻ như nó thậm chí sử dụng depcheck để tìm các phụ thuộc không sử dụng.
Alex K

3
npm outdatedkiểm tra và liệt kê các phiên bản gói hiện tại, muốn và mới nhất. Không có danh sách các gói không sử dụng mặc dù.
mgarde

1
không có vẻ hữu ích là tốt. Tôi đang sử dụng thiết lập góc tiêu chuẩn và điều này cũng liệt kê mọi gói là không sử dụng, điều này cũng sai
Kyle Burkett

5

Nếu bạn đang sử dụng hệ điều hành Unix như OS (Linux, OSX, v.v.) thì bạn có thể sử dụng kết hợp findegrepđể tìm kiếm các câu lệnh yêu cầu có chứa tên gói của bạn:

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

Nếu bạn tìm kiếm toàn bộ require('name-of-package')câu lệnh, hãy nhớ sử dụng đúng loại dấu ngoặc kép:

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

hoặc là

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

Nhược điểm là nó không hoàn toàn tự động, tức là nó không trích xuất tên gói package.jsonvà kiểm tra chúng. Bạn cần phải làm điều này cho mỗi gói mình. Vì package.jsonchỉ là JSON nên điều này có thể được khắc phục bằng cách viết một tập lệnh nhỏ sử dụng child_process.execđể chạy lệnh này cho mỗi phụ thuộc. Và làm cho nó một mô-đun. Và thêm nó vào repo NPM ...


Thế còn .jsxcác tập tin và .tstập tin, v.v: D
OZZIE

1
Rõ ràng sử dụng phương pháp này, chúng tôi không sử dụng mô-đun phản ứng trong ứng dụng React của chúng tôi: D
OZZIE

4

fiskeben đã viết:

Nhược điểm là nó không hoàn toàn tự động, tức là nó không trích xuất tên gói từ gói.json và kiểm tra chúng. Bạn cần phải làm điều này cho mỗi gói mình.

Hãy tự động trả lời câu trả lời của Fiskeben nếu vì lý do nào đó depcheckkhông hoạt động đúng! (Ví dụ: tôi đã thử nó với Typecript và nó đã đưa ra các lỗi phân tích không cần thiết)

Để phân tích cú pháp package.jsonchúng ta có thể sử dụng phần mềm jq. Kịch bản shell dưới đây yêu cầu một tên thư mục bắt đầu từ đâu.

#!/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"

Đầu tiên, nó tạo ra hai tệp tạm thời nơi chúng ta có thể lưu trữ tên gói và tệp.

Nó bắt đầu với findlệnh. Dòng đầu tiên và thứ hai làm cho nó bỏ qua node_modulesbuildcác thư mục (hoặc bất cứ điều gì bạn muốn). Dòng thứ ba chứa các phần mở rộng được phép, bạn có thể thêm nhiều hơn ở đây, ví dụ như các tệp JSX hoặc JSON.

Một chức năng sẽ đọc các loại phụ thuộc.

Đầu tiên, nó catpackage.json. Sau đó, jqđược nhóm phụ thuộc cần thiết. ( {} +ở đó để nó không gây ra lỗi nếu ví dụ: không có phụ thuộc ngang hàng trong tệp.)

Sau đó, sedtrích xuất các phần giữa các dấu ngoặc kép, tên gói. -n.../pbảo nó in các phần phù hợp và không có gì khác từ jqđầu ra JSON của. Sau đó chúng tôi đọc danh sách các tên gói thành một whilevòng lặp.

RESlà số lần xuất hiện của tên gói trong ngoặc kép. Ngay bây giờ, nó là import/ require... 'package'/ "package". Nó làm công việc cho hầu hết các trường hợp.

Sau đó, chúng tôi chỉ cần đếm số dòng kết quả sau đó in kết quả.

Hãy cẩn thận:

  • Không tìm thấy tệp trong các lần nhập khác nhau, ví dụ: tsconfig.jsontệp ( libtùy chọn)
  • Bạn phải grepthủ công cho chỉ ^USEDUNUSEDcác tập tin.
  • Nó chậm đối với các dự án lớn - kịch bản shell thường không có quy mô tốt. Nhưng hy vọng bạn sẽ không chạy nó nhiều lần.

1
Trình chỉnh sửa đôi khi gây ra nhập khẩu để bọc thành nhiều dòng. Tập lệnh này có bắt được các câu lệnh trong đó 'nhập' hoặc 'yêu cầu' sẽ nằm trên một dòng khác với 'từ ĐÓNG GÓI' Nói cách khác, nó bỏ qua khoảng trắng trong nhập khẩu hoặc yêu cầu báo cáo?
vdiaz1130


1

nhiều câu trả lời ở đây là làm thế nào để tìm các mục không sử dụng.

Tôi muốn loại bỏ chúng tự động .

  1. Cài đặt dự án nút này.

    $ npm install -g typescript tslint tslint-etc


  1. Tại thư mục gốc, thêm tệp mới tslint-import.json

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


  1. Chạy cái này có nguy cơ của riêng bạn, tạo một bản sao lưu :)

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


Nhưng điều này sẽ loại bỏ khỏi các tập tin js. Nhưng ya vẫn tốt.
Ayon Nahiyan

làm thế nào vềnpx depcheck --json | jq '.dependencies[]' | xargs -L1 npm rm
alex
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.