Ưu điểm của các phụ thuộc Bundled so với các phụ thuộc thông thường trong npm


83

npm cho phép chúng ta chỉ định bundledDependencies, nhưng lợi ích của việc làm như vậy là gì? Tôi đoán nếu chúng ta muốn hoàn toàn chắc chắn rằng chúng ta có được phiên bản phù hợp ngay cả khi mô-đun mà chúng ta tham chiếu bị xóa, hoặc có lẽ có lợi ích về tốc độ khi đóng gói?

Bất cứ ai biết những lợi thế của bundledDependenciesphụ thuộc bình thường?


16
'Nếu điều này được đánh vần là "packDependencies", thì điều đó cũng đáng trân trọng.' Tài liệu tuyệt vời!
Colonel Panic

10
Chưa hết, không hiểu sao việc sửa thành đọc đơn thuần là “cũng được vinh dự” cảm thấy buồn. Trong một tình huống ngặt nghèo, nếu tôi ra lệnh cho một samurai hoặc hiệp sĩ để hỗ trợ, tôi chắc chắn muốn anh ta đi kèm với vũ khí và áo giáp tương thích - và thật danh giá.
Jon Coombs

3
"Tôi đoán nếu chúng tôi muốn hoàn toàn đảm bảo rằng chúng tôi nhận được đúng phiên bản ngay cả khi mô-đun chúng tôi tham chiếu bị xóa" đột nhiên mang rất nhiều sức nặng: blog.npmjs.org/post/141577284765/kik-left-pad-and-npm
joews

Câu trả lời:


49

Một trong những vấn đề lớn nhất hiện nay với Node là tốc độ thay đổi của nó. Điều này có nghĩa là hệ thống sản xuất có thể rất mỏng manh và npm updatecó thể dễ dàng phá vỡ mọi thứ.

Sử dụng BundledDependencies là một cách để giải quyết vấn đề này bằng cách đảm bảo, như bạn phỏng đoán chính xác, rằng bạn sẽ luôn cung cấp các phụ thuộc chính xác cho dù điều gì khác có thể thay đổi.

Bạn cũng có thể sử dụng điều này để đóng gói các gói riêng tư của riêng bạn và phân phối chúng cùng với bản cài đặt.


1
Làm thế nào để nó luôn cung cấp các phụ thuộc chính xác? Điều này có nghĩa là npm updatesẽ không ảnh hưởng đến bất kỳ phụ thuộc nào trong các gói phụ thuộc?
Kevin Ghadyani

2
Vâng chính xác. Lưu ý rằng các phụ thuộc đi kèm có thể không "đúng" theo bất kỳ cách cơ bản nào. Họ chỉ là những gì người làm đóng gói SAID là chính xác.
Julian Knight

7
Có lẽ vì bạn đang xem một câu trả lời có tuổi đời năm rưỡi ! Số tiền mà Node.JS đã di chuyển trong thời gian đó là một hiện tượng. Có lẽ bạn muốn thêm điều gì đó hữu ích dưới dạng nhận xét?
Julian Knight

105

Đối với người đọc nhanh : QA này là về trường package.json BundledDependencies, không phải về gói .

Các gói phụ thuộc làm gì

"BundledDependencies" chính xác như tên gọi của chúng. Sự phụ thuộc nên có bên trong dự án của bạn. Vì vậy, chức năng về cơ bản giống như các phụ thuộc bình thường. Chúng cũng sẽ được đóng gói khi chạy npm pack.

Khi nào sử dụng chúng

Các phần phụ thuộc thông thường thường được cài đặt từ sổ đăng ký npm. Do đó, các gói phụ thuộc hữu ích khi:

  • bạn muốn sử dụng lại thư viện của bên thứ ba không đến từ sổ đăng ký npm hoặc đã được sửa đổi
  • bạn muốn sử dụng lại các dự án của riêng mình dưới dạng mô-đun
  • bạn muốn phân phối một số tệp với mô-đun của mình

Bằng cách này, bạn không phải tạo (và duy trì) kho lưu trữ npm của riêng mình, nhưng nhận được những lợi ích tương tự mà bạn nhận được từ các gói npm.

Khi nào không nên sử dụng các gói phụ thuộc

Mặc dù vậy, khi phát triển, tôi không nghĩ rằng điểm chính là ngăn các cập nhật ngẫu nhiên. Chúng tôi có các công cụ tốt hơn cho việc đó, cụ thể là kho lưu trữ mã (git, evalurial, svn ...) hoặc bây giờ là khóa tệp.

Để ghim các phiên bản gói của bạn, bạn có thể sử dụng:

  • Tùy chọn 1: Sử dụng phiên bản NPM 5 mới hơn đi kèm với nút 8. Nó sử dụng một package-lock.jsontệp (xem blog của nút và bản phát hành nút 8)

  • Lựa chọn 2: sử dụng sợi thay vì npm. Nó là một trình quản lý gói từ facebook, nhanh hơn npmvà nó sử dụng một yarn.locktệp. Nó sử dụng cùng một package.jsoncách khác.

Điều này có thể so sánh với các tệp khóa trong các trình quản lý gói khác như Bundler hoặc Cargo. Nó tương tự như npm-cowrap.json của npm, tuy nhiên nó không mất mát và nó tạo ra kết quả có thể tái tạo.

npmthực sự đã sao chép tính năng đó từ yarn, trong số những thứ khác.

  • Tùy chọn 3: đây là cách tiếp cận được đề xuất trước đây, mà tôi không khuyên dùng nữa. Ý tưởng là sử dụng npm shrinkwraphầu hết thời gian và đôi khi đưa toàn bộ, bao gồm cả thư mục node_module, vào kho lưu trữ mã của bạn. Hoặc có thể sử dụng gói thu nhỏ . Các phương pháp hay nhất vào thời điểm đó đã được thảo luận trên blog node.js và trên các trang web của nhà phát triển vui vẻ .

Xem thêm

Điều này hơi nằm ngoài phạm vi của câu hỏi, nhưng tôi muốn đề cập đến loại phụ thuộc cuối cùng (mà tôi biết): phụ thuộc ngang hàng . Cũng thấy điều này câu hỏi SO có liên quan và có thể là tài liệu của yarntrên bundledDependencies .


6
"bao gồm các thư mục node_module" - đó là một điều khá kỳ lạ gây ô nhiễm repo bằng mã được tạo ... đặc biệt là khi bạn đang làm việc với các module có nguồn gốc ...
Oleksandr

@Olexandr Giữa điều đó và rủi ro rằng một gói làm hỏng ứng dụng của bạn, tôi đoán sự lựa chọn là dễ dàng. Lưu ý rằng bạn có thể đặt trong một nhánh riêng (nếu sử dụng git chẳng hạn). Đồng ý, nó không phải là một giải pháp lý tưởng.
nha

3
Tôi khuyên bạn không nên kiểm tra node_modules vì ​​các gói như phantomjs chẳng hạn, sẽ cài đặt tệp nhị phân thích hợp cho hệ thống hiện tại. Điều này có nghĩa là nếu một Dev chạy cài đặt npm trên Linux và kiểm tra trong node_modules - nó sẽ không hoạt động đối với một Dev khác sao chép repo trên Windows. Tốt hơn nên kiểm tra tarballs mà npm cài đặt tải xuống và trỏ npm-cowrap.json vào chúng. Bạn có thể tự động hóa quá trình này bằng npm install -g shrinkpackcông cụ.
Jamie Mason,

1
Cảm ơn @nha, bạn cũng sẽ được bảo vệ khỏi điều đó với coppypack, vì tarball đăng ký sẽ nằm trong kho dự án của bạn.
Jamie Mason

1
@fold_left thực sự có, cảm ơn bạn đã chỉ nó (và để tạo ra gói thu nhỏ). Tôi chỉ nói rằng tất cả những điều này có thể tránh được nếu sổ đăng ký npm hoạt động giống như một kho dữ liệu bất biến.
nha

22

Ưu điểm khác là bạn có thể đặt các phụ thuộc nội bộ của mình (các thành phần ứng dụng) ở đó và sau đó chỉ cần yêu cầu chúng trong ứng dụng của bạn như thể chúng là các mô-đun độc lập thay vì làm lộn xộn lib / và xuất bản chúng lên npm.

Nếu / khi chúng trưởng thành đến mức chúng có thể sống dưới dạng các mô-đun riêng biệt, bạn có thể đặt chúng trên npm một cách dễ dàng mà không cần sửa đổi mã của bạn.


3

Tôi ngạc nhiên là tôi chưa thấy cái này ở đây, nhưng khi được chọn cẩn thận, nó bundledDependenciescó thể được sử dụng để tạo ra một gói phân phối từ npm packđó sẽ chạy trên một hệ thống npmchưa được định cấu hình. Điều này rất hữu ích nếu bạn có ví dụ như một hệ thống không được nối mạng / không có trên internet: mang gói của bạn qua ổ USB (hoặc bất cứ thứ gì) và giải nén tarball, sau đó npm runhoặc node index.jsnó hoạt động.

Có lẽ có một cách tốt hơn để đóng gói ứng dụng của bạn để chạy "ngoại tuyến", nhưng nếu có, tôi vẫn chưa tìm thấy.


0

Về mặt hoạt động, tôi xem BundledDependencies như một kho lưu trữ mô-đun riêng của mô-đun, nơi các phụ thuộc được công khai hơn, được giải quyết giữa mô-đun của bạn và các phụ thuộc của nó (và các phụ thuộc phụ). Mô-đun của bạn có thể dựa trên phiên bản cũ hơn của, chẳng hạn như react, nhưng phần phụ thuộc yêu cầu mới nhất và mới nhất. Gói / cài đặt của bạn sẽ dẫn đến phiên bản được ghim của bạn trong node_modules/$yourmodule/node_modules/react, trong khi người phụ thuộc của bạn sẽ nhận được phiên bản của họ node_modules/react(hoặc node_modules/$dependency/node_modules/reactnếu chúng nghiêng như vậy).

Lưu ý: Gần đây tôi đã gặp phải một phụ thuộc không định cấu hình đúng cách phụ thuộc của nó vào phản ứng và việc phản ứng trong các phụ thuộc BundledDependencies đã khiến mô-đun phụ thuộc đó bị lỗi trong thời gian chạy.

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.