Difference between grunt , npm and bower
Update for mid 2016:
The things are changing so fast that if it's late 2017 this answer might not be up to date anymore! Beginners can quickly get lost in choice of build tools and workflows, but what's most up to date in 2016 is not using Bower, Grunt or Gulp at all! With help of Webpack you can do everything directly in NPM!
- Google "npm as build tool" result: https://medium.com/@dabit3/introduction-to-using-npm-as-a-build-tool-b41076f488b0#.c33e74tsa
Don't get me wrong people use other workflows and I still use GULP in my legacy project(but slowly moving out of it), but this is how it's done in the best companies and developers working in this workflow make a LOT of money! Look at this template it's a very up-to-date setup consisting of a mixture of the best and the latest technologies:
- NPM as a build tool (no Gulp, Grunt or Bower)
- React with Redux
- the list is long. Go and explore!
When I want to add a package (and check in the dependency into git), where does it belong - into package.json or into bower.json
- Everything belongs in package.json now
- Dependencies required for build are in "devDependencies" i.e. npm install require-dir --save-dev (--save-dev updates your package.json by adding an entry to devDependencies)
- Dependencies required for your application during runtime are in "dependencies" i.e. npm install lodash --save (--save updates your package.json by adding an entry to dependencies)
If that is the case, when should I ever install packages explicitly like that without adding them to the file that manages dependencies (apart from installing command line tools globally)?
Always. Just because of comfort. When you add a flag (--save-dev or --save) the file that manages deps (package.json) gets updated automatically. Don't waste time by editing dependencies in it manually. Shortcut for npm install --save-dev package-name is npm i -D package-name and shortcut for npm install --save package-name is npm i -S package-nam
Npm and Bower are both dependency management tools. But the main difference between both is npm is used for installing Node js modules but bower js is used for managing front end components like html, css, js etc. A fact that makes this more confusing is that npm provides some packages which can be used in front-end development as well, like grunt and jshint. These lines add more meaning
Bower, unlike npm, can have multiple files (e.g. .js, .css, .html, .png, .ttf) which are considered the main file(s). Bower semantically considers these main files, when packaged together, a component.
- Zipping some files (e.g. zipup plugin)
- Linting on js files (jshint)
- Compiling less files (grunt-contrib-less)
When I want to add a package (and check in the dependency into git), where does it belong - into package.json or into bower.json It really depends where does this package belong to. If it is a node module(like grunt,request) then it will go in package.json otherwise into bower json.
When should I ever install packages explicitly like that without adding them to the file that manages dependencies
It does not matter whether you are installing packages explicitly or mentioning the dependency in .json file. Suppose you are in the middle of working on a node project and you need another project, say request, then you have two options:
- Edit the package.json file and add a dependency on 'request'
- npm install
- Use commandline: npm install --save request
- --save options adds the dependency to package.json file as well.
If you don't specify --saveoption, it will only download the package but the json file will be unaffected. You can do this either way, there will not be a substantial difference.