NPM è più comunemente usato per la gestione di moduli Node.js, ( ) ma funziona anche per il front-end. Bower invece è stato creato esclusivamente per il front-end ed è ottimizzato per questo compito, e si intsalla proprio come pacchetto npm
npm install -g bower
La differenza più grande è l'albero delle dipendenze di NPM è "nidificato" mentre Bower richiede un albero delle dipendenze piatta (cioè la risoluzione delle dipendenze deve essere risolta in un apposito file json dallo sviluppatore).
[...] "dependencies": { "angular": "1.4.8", "angular-animate": "1.4.8", "angular-cookies": "1.4.8", "angular-loading-bar": "0.7.1", "angular-material": "0.10.0", [...]
Un albero delle dipendenze "nidificato" significa che le dipendenze possono avere le proprie dipendenze, che possono averne di altre e così via.
Questo può andare bene sul server, in cui non c'è bisogno di preoccuparsi molto per lo spazio ma ovviamente non funziona bene sul front-end (molti plugin utilizzano una dipendenza da una libreria jQuery diversa, lui le scaricherebbe tutte! )
La ragione per cui molti progetti usano entrambi è che usano Bower per i pacchetti di front-end e NPM per strumenti di sviluppo come Yeoman, Grunt,CoffeeScript, etc.