Lệnh npm để gỡ cài đặt hoặc lược bớt các gói không sử dụng trong Node.js


414

Có cách nào để đơn giản gỡ cài đặt tất cả các phụ thuộc không sử dụng (chưa được khai báo) khỏi dự án Node.js (những thứ không còn được xác định trong tôi package.json.) Khi tôi cập nhật ứng dụng của mình, tôi muốn tự động xóa các gói không được kiểm tra.


1
Không được sử dụng bởi những gì? Bạn có nghĩa là loại bỏ các thư mục từ node_moduleskhi chúng bị xóa khỏi tương ứng package.json?
SLaks

1
chính xác, mhm npm sẽ đưa ra một gợi ý tốt là các ứng cử viên.
Tarion

Câu trả lời:


670

Lưu ý : Các npmphiên bản gần đây tự động thực hiện việc này khi khóa gói được bật, vì vậy điều này là không cần thiết ngoại trừ việc xóa các gói phát triển bằng --productioncờ.


Chạy npm pruneđể loại bỏ các mô-đun không được liệt kê trong package.json.

Từ npm help prune:

Lệnh này loại bỏ các gói "không liên quan". Nếu tên gói được cung cấp, thì chỉ các gói khớp với một trong các tên được cung cấp sẽ bị xóa.

Các gói không liên quan là các gói không được liệt kê trong danh sách phụ thuộc của gói cha.

Nếu --productioncờ được chỉ định, lệnh này sẽ xóa các gói được chỉ định trong devDependencies của bạn.


3
Nếu tôi đọc chính xác, điều này sẽ loại bỏ tất cả các phụ thuộc phụ, vì chúng không được liệt kê trong package.json. Có đúng không? Vì vậy, bản cập nhật hoặc cài đặt tiếp theo sẽ phải cài đặt lại chúng.
nshew

1
Có, nó sẽ loại bỏ phụ thuộc. Các phụ thuộc phụ thực sự được lưu trữ bên trong node_modulesthư mục riêng của mô-đun , vì vậy chúng được loại bỏ bằng mô-đun.
Darkhogg

2
Để tôi lấy một ví dụ. Tôi loại bỏ nghiệp chướng của mình package.json, nhưng bỏ đi. Khi tôi chạy npm prune, tôi hy vọng tất cả nghiệp chướng, bao gồm cả node_modulesthư mục riêng chứa các phụ thuộc của nó, sẽ bị xóa. Điều gì về sự phụ thuộc của Bower (bower-json, bower-logger, chmodr, fux, global, et al.). Về mặt kỹ thuật, những thứ đó không được liệt kê trong dự án của tôi package.json. Là những người loại bỏ hay không?
nshew

3
Không họ không. Lưu ý rằng chúng không phải của riêng bạn node_modules, mà bên trong node_modules/bower/node_modules , "được bảo vệ" bởi node_modules/bower/package.json. Sự phụ thuộc của gói của bạn và phụ thuộc của gói của bạn không bị trộn lẫn .
Darkhogg

2
xóa bản thu nhỏ của bạn trước khi cài đặt npm, nên có trong hướng dẫn ở trên.
Andy Ray

306

Nếu bạn không lo lắng về một thời gian vài phút để làm như vậy, một giải pháp sẽ được rm -rf node_modulesnpm installmột lần nữa để xây dựng lại các module địa phương.


93
Sẽ thật tuyệt nếu mọi người ngừng hạ thấp điều này mà không bình luận .. đó là một chiến lược hợp lệ để đặt lại một phụ thuộc dự án nút như là một thay thế cho câu trả lời được chấp nhận. Nếu bạn đã làm hỏng nội dung thư mục con của node_modules (dễ thực hiện với các phụ thuộc được liên kết với sym) hoặc nếu bạn có các thay đổi bổ sung như nút bumps hoặc phiên bản npm, thì prune sẽ không dọn sạch đúng thư mục node_modules nhưng câu trả lời này sẽ.
Pyrce

41
Việc xây dựng lại node_modulescũng xác minh package.jsontệp mô tả biểu đồ phụ thuộc có thể lặp lại. Loại bỏ và cài đặt lại của bạn node_modulesvề cơ bản là một thử nghiệm triển khai.
joemaller

2
@joemaller Không nhất thiết, hầu hết các quy trình triển khai đều có, một cách ngầm định hoặc rõ ràng, một số loại bộ đệm. Nếu một gói đã được cài đặt và phù hợp với đặc điểm kỹ thuật, nó sẽ được giữ lại. Việc gỡ bỏ sau đó cài đặt lại sẽ đưa (các) gói đó đến phiên bản mới nhất phù hợp.
Darkhogg

7
npm pruneđã không giúp một iota, nhưng điều này đã làm. Vấn đề của tôi là một symlink bị hỏng.
Eirik Birkeland

8
Trong nhiều trường hợp không lý tưởng hiện không khả thi với npm. Ngoài ra, câu hỏi chắc chắn không chỉ định một số ràng buộc đối với công việc lặp đi lặp lại hoặc tìm nạp bổ sung, chỉ là làm thế nào để đạt được mục tiêu cuối cùng. Câu trả lời này thỏa mãn câu hỏi như đã nêu, bất chấp những gì người khác có thể muốn ngoài mục tiêu đó.
Pyrce

10

Bạn có thể sử dụng npm-prune để loại bỏ các gói không liên quan.

npm prune [[<@scope>/]<pkg>...] [--production] [--dry-run] [--json]

Lệnh này loại bỏ các gói "không liên quan". Nếu tên gói được cung cấp, thì chỉ các gói khớp với một trong các tên được cung cấp sẽ bị xóa.

Các gói không liên quan là các gói không được liệt kê trong danh sách phụ thuộc của gói cha.

Nếu --production cờ được quy định hoặc NODE_ENV biến môi trường được thiết lập để sản xuất , lệnh này sẽ loại bỏ các gói theo quy định tại bạn devDependencies . Cài đặt - không sản xuất sẽ phủ nhận NODE_ENV đang được đặt thành sản xuất .

Nếu cờ --dry-run được sử dụng thì sẽ không có thay đổi nào thực sự được thực hiện.

Nếu cờ --json được sử dụng thì các thay đổi npm prune đã thực hiện (hoặc sẽ được thực hiện với --dry-run ) được in dưới dạng đối tượng JSON.

Trong hoạt động bình thường với gói Khóa kích hoạt, mô-đun không liên quan được cắt tỉa tự động khi module được cài đặt và bạn sẽ chỉ cần lệnh này với --production cờ.

Nếu bạn đã vô hiệu hóa khóa gói thì các mô-đun bên ngoài sẽ không bị xóa và bạn phải chạy npm prune theo thời gian để loại bỏ chúng.

Sử dụng npm-depupe để giảm trùng lặp

npm dedupe
npm ddp

Tìm kiếm cây gói cục bộ và cố gắng đơn giản hóa cấu trúc tổng thể bằng cách di chuyển các phụ thuộc xa hơn lên cây, nơi chúng có thể được chia sẻ hiệu quả hơn bởi nhiều gói phụ thuộc.

Ví dụ, hãy xem xét biểu đồ phụ thuộc này:

a
+-- b <-- depends on c@1.0.x
|    `-- c@1.0.3
`-- d <-- depends on c@~1.0.9
     `-- c@1.0.10

Trong trường hợp này, npm-depupe sẽ biến cây thành:

 a
 +-- b
 +-- d
 `-- c@1.0.10

Do tính chất phân cấp của tra cứu mô-đun của nút, cả b và d đều sẽ nhận được sự phụ thuộc của chúng được đáp ứng bởi gói c ở cấp gốc của cây.

Thuật toán chống trùng lặp đi trên cây, di chuyển từng phụ thuộc càng xa trong cây càng tốt, ngay cả khi không tìm thấy các bản sao. Điều này sẽ dẫn đến cả một cây phẳng và trùng lặp.


Tôi có nhiều mục hơn trong thư mục node_modules của mình sau khi chạy phần thưởng npm . Thở dài!
Neville
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.