Differenza tra Grunt, NPM e Bower (package.json vs bower.json)


612

Sono nuovo di usare npm e bower, costruendo la mia prima app in emberjs :).
Ho un po 'di esperienza con le rotaie, quindi ho familiarità con l'idea dei file per elencare le dipendenze (come il bundle Gemfile)

Domanda: quando voglio aggiungere un pacchetto (e controllare la dipendenza in git), dove appartiene - in package.jsono in bower.json?

Da quello che raccolgo, l'
esecuzione bower installrecupera il pacchetto e lo inserisce nella /vendordirectory,
eseguendolo npm installlo recupera e lo inserisce nella /node_modulesdirectory.

Questa risposta SO dice che bower è per front-end e npm è per roba back-end.
Ember-app-kit sembra aderire a questa distinzione dal primo sguardo ... Ma le istruzioni nel gruntfile per abilitare alcune funzionalità danno due comandi espliciti, quindi sono totalmente confuso qui.

Intuitivamente lo indovinerei

  1. npm install --save-dev nome-pacchetto equivarrebbe ad aggiungere il nome-pacchetto al mio pacchetto.json

  2. bower install --save nome-pacchetto potrebbe essere lo stesso dell'aggiunta del pacchetto a my bower.json e dell'esecuzione di bower install ?

In tal caso, quando dovrei mai installare pacchetti così esplicitamente senza aggiungerli al file che gestisce le dipendenze (oltre a installare gli strumenti da riga di comando a livello globale)?


1
possibile duplicato della differenza tra Bower e NPM?
Sindre Sorhus,

14
@SindreSorhus Questo non è un duplicato esatto. C'è anche una domanda aggiuntiva associata a questo post. A proposito, ti dispiace spiegare il downvote?
sachinjain024

1
Hai cambiato la risposta accettata? Sembra che quello altamente votato dal 2014 narra qualcosa di molto diverso da quello accettato dal 2016. Spiega anche perché suggerisce un altro approccio, quindi sono a posto. Solo un po 'sorpreso che sia accettato (o ri-accettato).

1
Sì, ho cambiato la risposta accettata perché ritengo che quella successiva sia molto più pertinente. Suppongo che in questa giungla di front-end molte persone siano confuse quanto me, quindi questa domanda ha guadagnato popolarità ben oltre le mie aspettative ... E ottiene ancora visualizzazioni 2 anni dopo. Grazie a Pawel ora c'è una risposta più attuale a cui le persone possono fare riferimento (prima utilizzo il webpack per il mio attuale lavoro).
apprendista

Risposte:


154

Aggiornamento per metà 2016 :

Le cose stanno cambiando così in fretta che se è la fine del 2017 questa risposta potrebbe non essere più aggiornata!

I principianti possono rapidamente perdersi nella scelta degli strumenti di costruzione e dei flussi di lavoro, ma ciò che è più aggiornato nel 2016 non utilizza affatto Bower, Grunt o Gulp! Con l'aiuto di Webpack puoi fare tutto direttamente in NPM!

Non fraintendetemi, le persone usano altri flussi di lavoro e continuo a usare GULP nel mio progetto legacy (ma lentamente mi sto allontanando), ma è così che viene fatto nelle migliori aziende e sviluppatori che lavorano in questo flusso di lavoro facendo MOLTI soldi!

Guarda questo modello è un'installazione molto aggiornata composta da una combinazione delle migliori e delle più recenti tecnologie: https://github.com/coryhouse/react-slingshot

  • Webpack
  • NPM come strumento di costruzione (no Gulp, Grunt o Bower)
  • Reagisci con Redux
  • ESLint
  • l'elenco è lungo. Vai ed esplora!

Le tue domande:

Quando voglio aggiungere un pacchetto (e controllare la dipendenza in git), dove appartiene - in package.json o in bower.json

  • Tutto appartiene a package.json ora

  • Le dipendenze richieste per la compilazione sono in "devDependencies", ovvero npm install require-dir --save-dev(--save-dev aggiorna il tuo package.json aggiungendo una voce a devDependencies)

  • Le dipendenze richieste per la tua applicazione durante il runtime sono in "dipendenze", ovvero npm install lodash --save(--save aggiorna il tuo package.json aggiungendo una voce alle dipendenze)

In tal caso, quando dovrei mai installare pacchetti così esplicitamente senza aggiungerli al file che gestisce le dipendenze (oltre a installare gli strumenti da riga di comando a livello globale)?

Sempre . Solo per conforto. Quando aggiungi un flag ( --save-devo --save) il file che gestisce i deps (package.json) viene aggiornato automaticamente. Non perdere tempo modificando le dipendenze in esso manualmente. Scorciatoia per npm install --save-dev package-nameis npm i -D package-namee scorciatoia per npm install --save package-nameisnpm i -S package-name


6
La tua risposta è molto supponente:> With help of Webpack you can do everything directly in NPM! Non è vero, non è nemmeno necessario il webpack nel suo flusso di lavoro
Augustin Riedinger,

26
Questa risposta sembra fare molte ipotesi. La domanda sta ponendo la differenza tra npm e bower, e questa risposta menziona il webpack per qualche motivo. Sì, il webpack è un modo per farlo, ma questa risposta fa sembrare che sia l'unico e giusto modo per farlo. Ad esempio, se qualcuno sta lavorando con Polymer 1.x, il flusso di lavoro standard utilizzerà bower e non c'è molto supporto per il webpack.
John Powers,

1
La risposta è in realtà rilevante, ma l'argomento fornito non è proprio: "ma è così che viene fatto" - beh, niente dovrebbe essere fatto solo perché dovrebbe essere apparentemente fatto (cioè è fatto da altri). Il denaro non ha nulla a che fare con il ragionamento per il flusso di lavoro.
forsberg,

3
Guardando questa risposta nel 2017. Passando alla documentazione: "webpack v1 è deprecato. Incoraggiamo tutti gli sviluppatori ad aggiornare al webpack 2. Seguire la nostra guida alla migrazione o fare riferimento alla documentazione di webpack 2 per maggiori informazioni." Haha sviluppo web classico.
user643011

1
@ user643011 Quando guardi la guida alla migrazione noterai che la maggior parte della configurazione rimane invariata e il resto sono solo cambiamenti estetici nella struttura della configurazione. Ho fatto la migrazione in un pomeriggio incluso un PR
Pawel

576

Npm e Bower sono entrambi strumenti di gestione delle dipendenze. Ma la differenza principale tra entrambi è npm per l'installazione dei moduli Node js, ma bower js viene utilizzato per la gestione di componenti front-end come html, css, js ecc .

Un fatto che rende questo più confuso è che npm fornisce alcuni pacchetti che possono essere utilizzati anche nello sviluppo front-end, come grunte jshint.

Queste righe aggiungono più significato

Bower, a differenza di npm, può avere più file (ad esempio .js, .css, .html, .png, .ttf) che sono considerati i file principali. Bower considera semanticamente questi file principali, quando impacchettati insieme, un componente.

Modifica : Grunt è abbastanza diverso da Npm e Bower. Grunt è uno strumento per l'esecuzione di attività javascript. Puoi fare molte cose usando il grugnito che altrimenti dovevi fare manualmente. Evidenziando alcuni degli usi di Grunt:

  1. Comprimere alcuni file (ad esempio plugin zipup)
  2. Linting su file js (jshint)
  3. Compilazione di meno file (grunt-contrib-less)

Ci sono plug-in grugniti per la compilazione di sass, l'ottimizzazione del tuo javascript, la copia di file / cartelle, la riduzione di javascript ecc.

Nota che anche il plugin grunt è un pacchetto npm.

Domanda 1

Quando voglio aggiungere un pacchetto (e controllare la dipendenza in git), dove appartiene - in package.json o in bower.json

Dipende davvero da dove appartiene questo pacchetto. Se è un modulo nodo (come grunt, request), andrà in package.json altrimenti in bower json.

Domanda 2

Quando mai dovrei installare i pacchetti in modo esplicito come quello senza aggiungerli al file che gestisce le dipendenze

Non importa se si installano i pacchetti in modo esplicito o si menziona la dipendenza nel file .json. Supponiamo che tu stia lavorando a un progetto nodo e che tu abbia bisogno di un altro progetto, diciamo request, quindi hai due opzioni:

  • Modifica il file package.json e aggiungi una dipendenza da "richiesta"
  • npm install

O

  • Usa la riga di comando: npm install --save request

--saveoptions aggiunge la dipendenza anche al file package.json. Se non specifichi l' --saveopzione, scaricherà solo il pacchetto ma il file json non sarà interessato.

Puoi farlo in entrambi i modi, non ci sarà una differenza sostanziale.


3
Grazie per il chiarimento e per l'articolo! Insightful e chiarisce la differenza (che dovrebbe aiutare a decidere dove mettere le dipendenze). Aspetterò se forse qualcuno risponderà all'ultima domanda (ri: quando dovrei mai voler installare i pacchetti individualmente), e accetterò la tua risposta più tardi :)
apprendista

1
Per quanto riguarda npm, potrebbe essere un gestore di pacchetti per i moduli NodeJS ma stiamo perdendo di vista che non è esclusivo solo di NodeJS. npm è altrettanto efficace nella gestione delle dipendenze sul lato client. Esempio: dontkry.com/posts/code/using-npm-on-the-client-side.html
Matt Smith

15
Cosa può fare Bower che npm non può fare?
Adam Soffer,

1
Si noti che il repository di plugin jQuery ( plugins.jquery.com ) è stato sostituito con npm.
thdoan

2
l'ultimo tutorial angolare Quickstart 2 (RC) e git seed usano npmsolo, a differenza del tutorial v1 che utilizzava sia npm che bower. Adoro davvero i fatti che (a) package.jsonè l'unica cosa da mantenere, (b) che calcola le dipendenze in modo ricorsivo in una riga npm install, e (c) quando c'è un problema devi solo cancellare la node_modulescartella ed eseguire npm install ancora.
Sebas,
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.