Paketlenmiş bağımlılıkların npm cinsinden normal bağımlılıklara göre avantajları


85

npm belirtmemize izin verir bundledDependencies, ancak bunu yapmanın avantajları nelerdir? Referans verdiğimiz modül silinse bile doğru sürümü aldığımızdan kesinlikle emin olmak istiyorsak ya da belki de paketlemenin hız avantajı var mı?

bundledDependenciesNormal bağımlılıklara göre avantajlarını bilen var mı?


16
"Bu" bundleDependencies "olarak yazıldıysa, bu da onurludur." Harika belgeler!
Albay Panic

10
Ve yine de, onu sadece "aynı zamanda onurlandırılır" şeklinde düzeltmek üzücü geliyor. Dar bir noktada, yardım için bir samuray veya şövalye sipariş etsem, kesinlikle uyumlu silahlar ve zırhlarla birlikte gelmesini ve onurlu olmasını isterim.
Jon Coombs

3
"Referans verdiğimiz modül silinse bile doğru sürümü aldığımızdan kesinlikle emin olmak istiyorsak" aniden çok fazla ağırlık taşıyor: blog.npmjs.org/post/141577284765/kik-left-pad-and-npm
joews

Yanıtlar:


49

Şu anda Node ile ilgili en büyük sorunlardan biri ne kadar hızlı değiştiğidir. Bu, üretim sistemlerinin çok kırılgan npm updateolabileceği ve bir şeyleri kolayca kırabileceği anlamına gelir .

Birlikte verilen bağımlılıkları kullanmak, doğru bir şekilde tahmin ettiğiniz gibi, başka ne olursa olsun her zaman doğru bağımlılıkları sunacağınızı garanti ederek bu sorunu aşmanın bir yoludur.

Bunu kendi özel paketlerinizi bir araya getirmek ve kurulumla birlikte teslim etmek için de kullanabilirsiniz.


1
Her zaman doğru bağımlılıkları nasıl sağlar? Bu npm update, paketlenmiş bağımlılıkları etkilemeyeceği anlamına mı geliyor ?
Kevin Ghadyani

2
Evet doğru. Paketlenmiş bağımlılıkların herhangi bir temelde "doğru" olmayabileceğini unutmayın. SAID'i paketleyen kişinin doğru olduğu şey bunlar.
Julian Knight

7
Belki de beş buçuk yıllık bir cevaba baktığınız içindir ! Node.JS'nin bu süre içinde taşıdığı miktar olağanüstü. Belki bunun yerine yorum olarak yararlı bir şey eklemek istersiniz?
Julian Knight

105

Hızlı Okuyucu için : Bu QA hakkındadır package.json , bundledDependencies alanında değil ilgili paketin .

BundledDependencies ne işe yarar?

"bundledDependencies" tam olarak adlarının ima ettiği şeydir. Projenizin içinde olması gereken bağımlılıklar. Yani işlevsellik temelde normal bağımlılıklar ile aynıdır. Ayrıca koşarken de paketlenecekler npm pack.

Ne zaman kullanılmalı

Normal bağımlılıklar genellikle npm kayıt defterinden yüklenir. Bu nedenle, paketlenmiş bağımlılıklar şu durumlarda kullanışlıdır:

  • npm kayıt defterinden gelmeyen veya değiştirilmiş bir üçüncü taraf kitaplığını yeniden kullanmak istiyorsanız
  • kendi projelerinizi modül olarak yeniden kullanmak istiyorsunuz
  • modülünüzle bazı dosyaları dağıtmak istiyorsunuz

Bu şekilde, kendi npm deponuzu oluşturmanız (ve sürdürmeniz) gerekmez, ancak npm paketlerinden elde ettiğiniz faydaların aynısını elde edersiniz.

Ne zaman değil paketlenmiş bağımlılıkları kullanmak

Geliştirme sırasında asıl noktanın yanlışlıkla güncellemeleri önlemek olduğunu düşünmüyorum. Bunun için daha iyi araçlarımız var, yani kod depoları (git, mercurial, svn ...) veya şimdi dosyaları kilitle.

Paket sürümlerinizi sabitlemek için şunları kullanabilirsiniz:

  • Seçenek1: Düğüm 8 ile birlikte gelen daha yeni NPM sürüm 5'i kullanın. Bir package-lock.jsondosya kullanır ( düğüm bloguna ve düğüm 8 sürümüne bakın)

  • 2. seçenek: Kullanım iplik yerine npm. Facebook'tan bir paket yöneticisidir, daha hızlıdır npmve bir yarn.lockdosya kullanır . package.jsonAksi takdirde aynı şeyi kullanır .

Bu, Bundler veya Cargo gibi diğer paket yöneticilerindeki kilit dosyalarıyla karşılaştırılabilir. Npm'nin npm-shrinkwrap.json dosyasına benzer, ancak kayıplı değildir ve tekrarlanabilir sonuçlar oluşturur.

npmaslında bu özelliği yarndiğer şeylerin yanı sıra kopyaladı .

  • Seçenek3: Bu, artık önermediğim daha önce önerilen yaklaşımdı. Fikir npm shrinkwrapçoğu zaman kullanmak ve bazen node_module klasörü dahil her şeyi kod deponuza koymaktı. Veya muhtemelen shrinkpack kullanın . O zamanki en iyi uygulamalar node.js blogunda ve joyent geliştirici web sitelerinde tartışıldı .

Ayrıca bakınız

Bu, sorunun kapsamının biraz dışında, ancak son tür bağımlılıklardan (bildiğim) bahsetmek istiyorum: akran bağımlılıkları . Ayrıca, bu bkz İlgili SO soru ve muhtemelen belgeler yarnüzerinde bundledDependencies .


6
"node_module klasörü dahil" - deponuzu üretilen kodla kirleten oldukça garip bir şey ... özellikle yerel modüller ile çalışırken ...
Oleksandr

@Olexandr Bu ve bir paketin uygulamanızı bozması riski arasında seçim yapmak kolay sanırım. Ayrı bir dal koyabileceğinizi unutmayın (örneğin git kullanıyorsanız). Kabul edildi, ideal bir çözüm olmaktan uzak.
nha

3
Örneğin phantomjs gibi mevcut sistem için uygun ikiliyi kuran paketler nedeniyle node_modules'i kontrol etmemenizi tavsiye ederim. Bu, bir Dev'in Linux'ta npm yüklemesini çalıştırması ve node_modules'i kontrol etmesi durumunda, depoyu Windows'ta klonlayan başka bir Dev için çalışmayacağı anlamına gelir. İndirmeleri yükleyen ve npm-shrinkwrap.json'u onlara yönlendiren npm tarball'larını kontrol etmek daha iyidir. npm install -g shrinkpackAracı kullanarak bu işlemi otomatikleştirebilirsiniz .
Jamie Mason

1
Teşekkürler @nha, kayıt defteri tarball'ları proje deponuzda olacağı için bundan da shrinkpack ile korunacaksınız.
Jamie Mason

1
@fold_left evet gerçekten, işaret ettiğiniz için teşekkürler (ve shrinkpack yaptığınız için). Npm kayıt defteri değişmez bir veri deposu gibi davranıyorsa tüm bunlardan kaçınılabileceğini söylüyordum.
nha

22

Diğer bir avantajı da, dahili bağımlılıklarınızı (uygulama bileşenleri) oraya koyabilmeniz ve ardından lib'inizi karıştırıp npm'de yayınlamak yerine bağımsız modüllermiş gibi bunları uygulamanızda gerektirebilmenizdir.

Ayrı modüller olarak yaşayabilecekleri noktaya geldiklerinde / olgunlaştıklarında, kodunuzu değiştirmeden bunları kolayca npm'ye koyabilirsiniz.


3

Bunu burada görmediğime şaşırdım, ancak dikkatlice seçildiğinde, yapılandırılmamış bir sistemde çalışacak bundledDependenciesdağıtılabilir bir paket oluşturmak için kullanılabilir . Bu, örneğin ağa bağlı olmayan / internette olmayan bir sisteminiz varsa yararlıdır: paketinizi bir flash sürücüye (veya her neyse) getirin ve tarball'ı açın, o zaman veya ve Just Works.npm packnpmnpm runnode index.js

Belki uygulamanızı "çevrimdışı" çalıştırmak için paketlemenin daha iyi bir yolu vardır, ancak varsa onu bulamadım.


0

Operasyonel olarak, bağımlılıkların daha genel olduğu, modülünüz ve bağımlılıkları (ve alt bağımlılıkları) arasında çözülen bir modülün özel modül deposu olarak bundledDependencies ürününe bakıyorum. Modülünüz, örneğin react'in eski bir sürümüne güvenebilir, ancak bir bağımlılık en son ve en büyüğü gerektirir. Paketiniz / yüklemeniz sabitlenmiş sürümünüzle sonuçlanırken node_modules/$yourmodule/node_modules/react, bağımlılığınız sürümlerini alacaktır node_modules/react(veya node_modules/$dependency/node_modules/reactçok eğilimli iseler).

Bir uyarı: Son zamanlarda, reacte bağımlılığını düzgün bir şekilde yapılandırmayan bir bağımlılıkla karşılaştım ve bundledDependencies programında tepki vermiş olmak, bu bağımlı modülün çalışma zamanında başarısız olmasına neden oldu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.