How do I decide whether to use NPM or Bower to install dependencies?
Is there a ‘best practice’, or any way to choose?
Are there any others that I need to be aware of?
As @seth-pollack pointed out, npm is mostly used for server-side dependencies and bower for client-side ones. But you could still use npm in front-end development for development dependencies, such as task runners (Grunt, Gulp, etc), test runners, lint checker, etc. Bower, on the other hand, is mostly used for dependencies that you want available in your deployed app.
Use bower for front-end dependencies and NPM for server side.
NPM is more geared for server side libraries, but, can be used for front end. Bower was created for front end libraries.
Also NPM uses a nested dependency tree which has a much bigger footprint, while bower uses a flat dependency tree.
Also, bower will force you to only have a single version of a library, while NPM will let you have multiple versions.
Bower is better suited for front-end packages and has AMD libraries which you would use with RequireJS etc.
NPM on the other hand has many libraries that are packaged as CommonJS modules. These would require you to use a build tool such as Browserify to make them usable in the browser.
There is no reason why you shouldn’t use one or the other. You’ll have to pick the one that does the job.