Grunt,NPM和Bower之间的区别(package.json与bower.json)


612

我是使用npm和bower的新手,在emberjs中构建了我的第一个应用程序:)。
我确实有一些关于Rails的经验,所以我熟悉列出依赖项的文件(例如捆绑程序Gemfile)的概念

问:当我想添加一个包(并检查依赖性进入GIT),在那里它属于-成package.json或成bower.json

从我所收集,
运行bower install将获取的包,并把它放在/vendor目录下,
运行npm install会取它,把它放进/node_modules目录。

这样的回答说,Bower用于前端,而npm用于后端。乍一看,
Ember-app-kit似乎坚持了这种区别...但是gruntfile中的用于启用某些功能的指令给出了两个显式命令,因此我在这里完全感到困惑。

凭直觉我会猜到

  1. npm install --save-dev软件包名称等同于将软件包名称添加到我的package.json中

  2. bower install --save软件包名称可能与将软件包添加到我的bower.json并运行bower install相同

如果是这样,我什么时候应该显式安装软件包而不将其添加到管理依赖项的文件中(除了全局安装命令行工具以外)?



14
@SindreSorhus这不是完全相同的副本。此帖子中还有其他相关问题。顺便说一句,你介意解释下票吗?
sachinjain024 2014年

1
您是否更改了接受的答案?似乎2014年获得高度评价的方法与2016年以来被接受的方法有很大不同。这也解释了为什么它建议使用另一种方法,所以我对此很满意。一点被它接受(或重新接受)感到惊讶。

1
是的,我更改了接受的答案,因为我觉得后面的答案更有意义。我想在这个前端丛林中,许多人和我一样感到困惑,所以这个问题的普及程度超出了我的预期...并且在两年后仍然得到人们的意见。多亏了Pawel,现在有了更多可供人们参考的最新答案(之前我在目前的工作中使用的是webpack)。
apprenticeDev

Answers:


154

2016年中更新

事情变化太快了,如果到了2017年末,这个答案可能就不再是最新的了!

初学者可能会很快迷失在选择构建工具和工作流程中,但是2016年最新的是根本不使用Bower,Grunt或Gulp!借助Webpack,您可以直接在NPM中进行所有操作!

不要误会我的意思,人们使用其他工作流程,并且我仍在旧项目中使用GULP(但慢慢地移出了它),但这是最好的公司和从事此工作流程的开发人员所采用的方式,这笔钱可真可观!

看看这个模板,它是一个最新的设置,由最好的技术和最新的技术组成:https : //github.com/coryhouse/react-slingshot

  • Webpack
  • NPM作为构建工具(无Gulp,Grunt或Bower)
  • 与Redux反应
  • ESLint
  • 清单很长。去探索!

你的问题:

当我想添加一个包(并将依赖项检入git)时,它属于哪里-进入package.json或bower.json

  • 一切现在都属于package.json

  • 构建所需的依赖关系位于“ devDependencies”中,即npm install require-dir --save-dev(--save-dev通过在devDependencies中添加条目来更新package.json)

  • 应用程序在运行时所需的依赖项位于“依赖项”中,即npm install lodash --save(--save通过在依赖项中添加条目来更新package.json)

如果是这样,我什么时候应该显式安装软件包而不将其添加到管理依赖项的文件中(除了全局安装命令行工具以外)?

总是。只是因为舒适。添加标志(--save-dev--save)时,管理deps(package.json)的文件会自动更新。不要浪费时间手动编辑依赖项。捷径npm install --save-dev package-namenpm i -D package-name和快捷的npm install --save package-nameISnpm i -S package-name


6
您的回答非常With help of Webpack you can do everything directly in NPM! 有道理:> 事实并非如此,甚至在他的工作流程中甚至都不需要webpack
Augustin Riedinger

26
这个答案似乎有很多假设。问题是询问npm和bower之间的区别,并且出于某种原因,这个答案是提到webpack。是的,webpack是执行此操作的一种方法,但是此答案使它看起来像是唯一正确的方法。例如,如果某人正在使用Polymer 1.x,则标准工作流程将使用Bower,并且对webpack的支持不多。
John Powers

1
答案实际上是相关的,但是给出的论据不是真的:“但这就是它的完成方式”-好吧,什么也不应该做,只是因为它似乎已经完成了(即由他人完成了)。金钱与工作流程的推理无关。
forsberg '17

3
在2017年查看此答案。转到文档:“不建议使用webpack v1。我们鼓励所有开发人员升级到webpack2。请参阅我们的迁移指南,或参阅webpack 2文档以获取更多信息。” 哈哈经典的网页开发。
user643011

1
@ user643011查看迁移指南时,您会注意到大多数配置保持不变,其余只是配置结构上的外观变化。我在一个下午进行了迁移,其中包括PR
Pawel

576

Npm和Bower都是依赖项管理工具。但是两者之间的主要区别是npm用于安装Node js模块,而bower js用于管理前端组件,例如html,css,js等

更令人困惑的一个事实是,npm提供了一些可以在前端开发中使用的软件包,例如gruntjshint

这些行增加了更多含义

Bower与npm不同,可以具有多个文件(例如.js,.css,.html,.png,.ttf),这些文件被视为主要文件。当打包在一起时,Bower在语义上将这些主文件视为一个组件。

编辑Grunt与Npm和Bower完全不同。Grunt是一个JavaScript任务运行器工具。您可以使用grunt来做很多事情,否则必须手动进行。重点介绍Grunt的一些用法:

  1. 压缩一些文件(例如zipup插件)
  2. 在JS文件上整理(jshint)
  3. 编译更少的文件(无需grunt-contrib)

有一些用于sass编译,丑陋的javascript,复制文件/文件夹,缩小javascript的grunt插件。

请注意,grunt插件也是npm软件包。

问题1

当我想添加一个包(并将依赖项检入git)时,它属于哪里-进入package.json或bower.json

这实际上取决于此程序包所属的位置。如果它是节点模块(例如grunt,request),则它将进入package.json,否则进入Bower json。

问题2

我何时应该像这样显式安装软件包而不将其添加到管理依赖项的文件中

无论是显式安装软件包还是在.json文件中提及依赖关系都没有关系。假设您正在处理节点项目,并且需要另一个项目,例如request,那么您有两个选择:

  • 编辑package.json文件并添加对'request'的依赖
  • npm安装

要么

  • 使用命令行: npm install --save request

--saveoptions也将依赖项添加到package.json文件。如果不指定--saveoption,它将仅下载软件包,而json文件不会受到影响。

您可以通过任何一种方式来执行此操作,不会有很大的不同。


3
感谢您的澄清和文章!有见地,并阐明了差异(这应该有助于确定将依赖项放在何处)。我将等待是否有人会听到最后一个问题(例如:我什么时候想单独安装软件包),以后再接受您的回答:)
apprenticeDev

1
关于npm,它可能是NodeJS模块的程序包管理器,但我们已经看不到它不仅仅限于NodeJS。npm与管理客户端依赖项同样有效。例如: dontkry.com/posts/code/using-npm-on-the-client-side.html
Matt Smith,

15
凉亭能做npm不能做的什么?
亚当·索弗

1
请注意,jQuery插件存储库(plugins.jquery.com)已被npm取代。
thdoan 2015年

2
最新的quickstart angular 2(RC)教程和git seed npm仅使用,而不是同时使用npm和bower的v1教程。我真的很喜欢这样一个事实,即(a)package.json是唯一需要维护的东西,(b)它在一个内衬中递归地计算依赖关系npm install,以及(c)当出现问题时,您只需要删除node_modules文件夹并运行npm install再次。
塞巴(Sebas)2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.