Gestione delle dipendenze JavaScript: npm vs. bower vs. volo [chiuso]


160

Come fai a confrontare npm, bowere volo?

Tutti e tre possono essere utilizzati per installare dipendenze JavaScript per un progetto UI. Capisco che npmè più specifico del nodo.

Quindi, quando usare cosa?

npmsi erge ancora lontano, ma bowere volosembrano essere risolvere esattamente lo stesso problema, anche se non sono in grado di tracciare una linea tra npme bower-volo.



1
Se stai leggendo questa domanda e desideri una risposta dal 2015, vedi la mia risposta aggiornata.
gustavohenke,

Risposte:


104

Una descrizione che descrive meglio la differenza tra npm e bower è: npm gestisce i moduli JavaScript chiamati pacchetti e Bower gestisce i componenti front-end (ovvero css, html e JavaScript) chiamati componenti. npm è anche usato per installare il pergolato. Ecco un ampio articolo su npm e bower (non copre il volo) che approfondisce i dettagli.


88
Questa non è una descrizione molto buona. Npm può certamente essere usato per installare componenti front-end.
BT

Anche se ho notato che alcune librerie di "frontend" su npm vengono abbandonate a favore delle loro controparti di pergolato. Prendiamo ad esempio Ember , che non è stato pubblicato da un anno.
briangonzalez,

4
@Nate Il nome è semplicemente dove è iniziato. NPM è ora un sistema di gestione dei pacchetti molto generico. Uso regolarmente npm per installare i moduli front-end. Non c'è alcuna differenza nell'uso di NPM per moduli commonjs, vs amd, vs qualsiasi altra cosa. È possibile utilizzare npm anche per i moduli non javascript. Pertanto, questa non è semplicemente una differenza tra npm e bower. Sia che li chiami pacchetti o componenti, sono uguali in quanto sono entrambi raccolte di file arbitrari.
BT,

2
Questa è una risposta molto fuorviante se si considera che Bower non ha alcuna politica per gestire HTML, CSS e JavaScript. npm non ha alcuna politica a parte il fatto che quasi tutto su npm è scritto per supportare almeno commonjs e occasionalmente altri formati. Puoi mettere html e css in pacchetti npm come fai con bower. Esistono molti pacchetti solo frontend su npm, inclusi pacchetti che includono css e html.
sottostacco

3
Se stai usando browserify , npm è il gestore di pacchetti perfetto. Non credo sia importante quale gestore di pacchetti usi, ma mi atterrei personalmente a uno solo per progetto.
Eruant,

72

pergolato

È ancora molto popolare tra gli sviluppatori front-end, anche se ha pochissime funzionalità. Ogni pacchetto front-end lo sta utilizzando. C'è anche un'iniziativa per fondere il pergolato in npm .

Bower è ottimizzato per il lato client e supporta solo alberi di dipendenze piatti, ovvero ogni libreria deve essere utilizzata una sola volta (poiché è costosa spedire al client versioni diverse della stessa libreria) e i vincoli di dipendenza devono essere risolti dall'utente .

Puoi aspettarti di trovare tutto ciò che è relativo al front-end nel registro di Bower ( bower search <some keyword>) - a mio avviso, questo è il più grande vantaggio di Bower rispetto ad altri gestori di pacchetti.

Volo

Non lo uso ancora da più di 5 minuti da anni. Non lo so, ma da quello che posso vedere include uno strumento di compilazione, che è molto familiare agli utenti di Grunt.

npm

Sì, npm sta per Node Package Manager. Ma al giorno d'oggi puoi usarlo per tutto; le persone non stanno più solo npm installgestendo le cose e si aspettano che funzionino solo nell'ambiente Node. Ad esempio, ci sono molti pacchetti npm per Twitter Bootstrap .

Npm è ottimizzato per l'utilizzo sul lato server, con un albero delle dipendenze nidificato. Ogni dipendenza può avere le proprie dipendenze che possono avere le proprie, e così via. Questa versione di dipendenza eliminata è in conflitto poiché ogni dipendenza può utilizzare la propria versione di es. Underscore. Tuttavia, la prossima versione di npm 3 appiattirà l'albero delle dipendenze :

Con npm @ 3, la tua directory node_modules sarà molto più piatta. Tutte le tue dipendenze e la maggior parte delle tue sottodipendenze (e (sotto) + dipendenze) saranno sedute una accanto all'altra al livello più alto. Solo in caso di conflitti i moduli verranno installati a livelli più profondi. Questo dovrebbe rendere le cose molto più facili per gli utenti Windows.

Alcuni vantaggi che vedo sull'uso di npm:

  • È utilizzato da tutti gli altri gestori di pacchetti (component, bower, volo, JSPM, ecc.);
  • Permette l'utilizzo di script di build;
  • Sono disponibili numerosi strumenti per l'introspezione di pacchetti basati su npm

npm è il gestore dei pacchetti per JavaScript.

screenshot di npmjs.com


A febbraio 2013, la mia opinione era la seguente. Per favore, non tenerlo più in considerazione.

npm

È meglio attenersi a questo quando ci si trova in un progetto Node, ci sono pochissimi progetti disponibili anche per i browser ...

pergolato

Bower è il ragazzo pop in questo momento. Hanno molti progetti sotto il loro controllo e i manutentori del progetto amano mantenerli aggiornati nel registro dei periti ...

È un peccato che a volte sia un piccolo passeggino.

Volo

Da allora non ho provato il volo per più di 5 minuti, ma da quello che ho potuto vedere sembra essere più flessibile del pergolato.

Un punto negativo per il volo è che i loro progetti sono molto obsoleti.


19
Esistono migliaia di moduli su npm che funzionano solo nei browser o funzionano sia nei nodi che nei browser. Molti di loro hanno persino badge che ti dicono esattamente in quali browser funzionano. Quasi tutto su Bower e tutto è probabilmente su npm.
sottostacco

Non capisco la necessità di un progetto come ngBoilerplate per usare il pergolato mentre dipende già da npm per l'installazione
lolski

5
Che cos'è un "ragazzo pop"? "Pop" è un abbrev. per "popolare"?
Bryan Oakley,

4
Nel tuo screenshot npm sta per manuale di pianificazione nucleare;)
Jim Jones

24

Sembrano risolvere lo stesso problema ma per ambienti / mondi diversi. NPM per nodejs e volo, bower per il browser.

La verità è che puoi usare NPM anche per gestire javascript e css per il browser. Non c'è nulla che ti impedisca di farlo. In questo senso, usare NPM mi sembra più naturale che dover gestire due strumenti diversi per lo stesso scopo.

Sembra che Bower abbia più pacchetti disponibili, almeno per quelli più popolari. Ma presto anche jQuery sarà disponibile direttamente in NPM e probabilmente tutte le altre librerie seguiranno la stessa tendenza.

A mio avviso, dal momento che esistono strumenti come browserify e webmake là fuori, che aiutano a utilizzare i moduli del nodo nel browser, non c'è più un reale bisogno di bower o volo , a meno che non offrano qualcos'altro per te (un modulo particolare esistente solo in i loro registri).

Anche Volo e Bower sono buoni, ma dal mio punto di vista, se stai già usando NPM, potrebbe essere meglio attenersi ad esso.

Si noti che è possibile utilizzare NPM per gestire le dipendenze dei client anche senza usare browserify o webmake . Nella maggior parte dei progetti a cui sto lavorando, dopo l'installazione dei moduli npm eseguo uno script per distribuirli nella posizione in cui la mia app client li utilizza. A volte uso grunt per concatenare quel file con altri file js e a volte lo faccio riferimento direttamente dai file modello delle mie app web. In ogni caso, questa è una preferenza personale. Altri potrebbero trovare Bower o Volo più facili da usare in quanto si adattano in modo più naturale ai loro flussi di lavoro.


1
È bello avere soluzioni concorrenti per lo stesso problema. Qualche idea sul perché il yeomanprogetto abbia scelto di creare un nuovo gestore di pacchetti quando lo avevamo già fatto npm? (Era maturo, famoso e ricco di funzionalità) Questo pensiero mi fa sentire che mi manca ancora il punto.
Yugal Jindle,

1
Non proprio, ma come hai detto alcune volte è divertente reinventare la ruota, solo perché puoi, e talvolta facendo alcuni miglioramenti vengono fatti mentre provi a risolvere lo stesso problema. Non proprio perché scelgono di crearne uno nuovo, oltre a rendere più semplice frontend per gli sviluppatori per trovare i pacchetti. Non tutti gli sviluppatori di frontend hanno esperienza nel nodo, immagino che sia la ragione principale dietro progetti come Bower. Prova a semplificare gli utenti non nodi, sto solo indovinando qui.
roy riojas,

Immagino che volessero separare la seccatura di npma favore della semplicità del frontend. Quindi per lo sviluppo di frontend.
Yugal Jindle,

15

Il grande vantaggio di Bower rispetto a NPM è che la sua gestione delle dipendenze impone l'utilizzo di una singola versione di un componente (mentre NPM funziona avendo copie / versioni diverse come sottodipendenze di moduli diversi). Questa è UNA COSA MOLTO BUONA perché impedisce al javascript lato client di gonfiarsi perché è necessario includere più copie di un componente in versioni diverse. Includere più copie di un modulo è fondamentale per il funzionamento della gestione delle dipendenze di NPM e pertanto NPM non è del tutto adatto alla gestione dei pacchetti lato client.

Una conseguenza di quanto sopra è che i manutentori e i consumatori di pacchetti pergolati devono essere più attenti a mantenere i loro numeri di versione delle dipendenze per evitare conflitti, ma è un prezzo che vale la pena pagare. E trovo che i moduli NPM siano spesso sciatti nell'emissione di versioni principali, minori e patch, quindi la gestione delle dipendenze NPM non è esattamente un letto di rose.


3
Questo è vero solo se stai offrendo il tuo codice frontend direttamente dalla cartella in cui il gestore pacchetti ha inserito quei file. Nel mio caso ho uno script di build per elaborare i file less / js o browserify per creare un bundle da quei file. Quindi non è davvero un grosso problema nel mio caso. Il codice distribuito ha sempre le versioni giuste, anche quando altri componenti secondari potrebbero avere duplicati durante lo sviluppo, non arrivano mai alla produzione.
roy riojas,

anche se inavvertitamente stai richiedendo (come sottodipendenze) due diverse versioni della stessa dipendenza? Penso che in questo caso ti sbagli
whereesrhys

Di solito non ho bisogno di moduli che non controllo, quindi saranno sempre quelli giusti ... se inavvertitamente un modulo tenta di richiedere un determinato modulo tra quelli sfalsati, la build fallirà. Non ha senso usare il pergolato nel mio caso nessun beneficio aggiunto
roy riojas,

Quindi npm può tranquillamente affermare di evitare la duplicazione dei moduli nel codice lato client se si ha il controllo dell'intero albero delle dipendenze. Questo non è certamente il caso della stragrande maggioranza delle cose su cui lavoro e probabilmente non per la maggior parte dei progetti che utilizzano un gestore delle dipendenze per includere i moduli lato client.
wheresrhys

1
A meno che tu non stia lavorando su mashup, l'albero delle tue dipendenze non sarà così complicato, almeno per il codice di terze parti. La maggior parte delle librerie js esporta un singolo globale, quindi usando browserify-shim puoi assicurarti di poterli usare dall'ambito globale, quindi sempre una versione che controlli. Il mio punto è che puoi ottenere lo stesso senza la necessità di un altro gestore di pacchetti oltre a quello che hai già. Alla fine potrebbe essere una questione di preferenze. Ci sono sempre dei compromessi da fare.
roy riojas,

5

So che questo non rientra nell'ambito della domanda, ma esiste anche un'altra alternativa. Jam JS - http://jamjs.org/ Una cosa interessante è che ha capacità di grugnito in jam:

jam compile output.js

Qualcuno dovrebbe creare un altro gestore di pacchetti e nominarlo: yapm :)


5
Il tuo desiderio è concesso: github.com/rlidwka/yapm : P
alex

1
beh, stavo pensando per il gestore delle dipendenze lato browser, ma credo che questo lavoro sia per entrambi: p Questo è il motivo per cui non posso fare startup, tutte le mie idee erano già pensate.
Bruce Lim,

@BruceLim sì, ogni volta che pensiamo di avere una buona idea, ci sono sempre altre persone che lo hanno già ottenuto.
Evan Hu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.