bower和npm都可以通过包名称,Git URL甚至任意的URL来安装包,也都可以为前端进行包管理。

关于npm

1、npm安装依赖包的时候,会将包的不同版本放在合适的地方,从而,可以在想要的地方加载想要的版本。但是,这样对于前端来说,就是噩梦了(比如有两个版本的jQuery,或者两个版本的Bootstrap)。

2、npm是为JavaScript服务的包管理器,目前的仓库中大多数都是Node.js包,使用Browserify进行适配之后,某些模块可以在客户端运行,但还有很多仍然不行。

3、npm会创建一个树形的依赖关系,而bower创建的是扁平化的层级依赖关系。

树形的依赖关系的意思就是每一个包都可以有他自己的依赖包。在服务器上,这样做很好,并不用太关心空间不够用什么的。但是,在前端,这样就显得很不友好了,想象一下一个网站同时加载了三个不同版本的jQuery。

关于bower

bower是被设计用来管理前端的包。

1、bower安装的目录结构是扁平的。相互依赖的包会被放到同一级目录下。

2、由于目录扁平化,所以,发生版本冲突的时候,需要人工解决。这样,任何人得到这个项目,安装的包的版本都是相同的了。

所以,这也就是为什么很多项目使用bower来安装前端相关的包,而使用npm来安装一些自动化工具(比如Gulp,Grunt,JSHint等)的原因了。