ChatGPT解决这个技术问题 Extra ChatGPT

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

我是使用 npm 和 bower 的新手,在 emberjs 中构建我的第一个应用程序 :)。我确实对rails有点经验,所以我熟悉用于列出依赖项的文件的想法(例如bundler Gemfile)

问题:当我想添加一个包(并将依赖项签入 git)时,它属于哪里 - 到 package.jsonbower.json

据我所知,
运行 bower install 将获取包并将其放入 /vendor 目录,
运行 npm install 它将获取它并将其放入 /node_modules 目录。

This SO answer 说 bower 用于前端,npm 用于后端。
Ember-app-kit 乍一看似乎坚持这种区别...但是 gruntfile 中 enabling some functionality 的说明给出了两个明确的命令,所以我在这里完全糊涂了。

直觉上我会猜到

npm install --save-dev package-name 相当于将包名添加到我的 package.json bower install --save package-name 可能与将包添加到我的 bower.json 并运行 bower install 相同?

如果是这种情况,我什么时候应该像这样明确地安装软件包而不将它们添加到管理依赖项的文件中(除了全局安装命令行工具)?

@SindreSorhus 这不是完全重复的。这篇文章中还有其他相关的问题。顺便说一句,您介意解释否决票吗?
您是否更改了已接受的答案?似乎 2014 年获得高度评价的说法与 2016 年接受的说法完全不同。它也解释了为什么它提出了另一种方法,所以我对此很满意。只是有点惊讶它被接受(或重新接受)。
是的,我改变了接受的答案,因为我觉得后一个更相关。我想在这个前端丛林中,很多人都和我一样困惑,所以这个问题的受欢迎程度超出了我的预期......并且在 2 年后仍然得到了关注。多亏了 Pawel,现在有一个更新的答案供人们参考(我现在的工作中使用的是 webpack)。

y
yoniLavi

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 的一些用途:

压缩一些文件(例如 zipup 插件) Linting js 文件(jshint) 编译更少的文件(grunt-contrib-less)

有用于 sass 编译、丑化你的 javascript、复制文件/文件夹、缩小 javascript 等的 grunt 插件。

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

问题一

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

这真的取决于这个包属于哪里。如果它是一个节点模块(如 grunt、request),那么它将进入 package.json,否则进入 bower json。

问题2

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

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

编辑 package.json 文件并添加对“请求”的依赖

npm 安装

或者

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

--save 选项也将依赖项添加到 package.json 文件。如果不指定 --save 选项,它只会下载包,但 json 文件不受影响。

你可以这样做,不会有实质性的区别。


感谢您的澄清和文章!有见地,并澄清了差异(这应该有助于决定将依赖项放在哪里)。我会等待也许有人会在最后一个问题上插话(回复:我什么时候想单独安装软件包),稍后接受你的回答:)
关于 npm,它可能是 NodeJS 模块的包管理器,但我们忽略了它不仅限于 NodeJS。 npm 同样有效地管理客户端依赖项。例如:dontkry.com/posts/code/using-npm-on-the-client-side.html
bower 能做什么而 npm 不能?
请注意,jQuery 插件存储库 (plugins.jquery.com) 已替换为 npm。
最新的快速入门 Angular 2 (RC) 教程和 git 种子仅使用 npm,与同时使用 npm 和 bower 的 v1 教程相反。我真的非常喜欢以下事实:(a)package.json 是唯一需要维护的东西,(b)它在单行 npm install 中递归地计算依赖关系,以及(c)当出现问题时您只需要删除node_modules 文件夹并再次运行 npm install。
P
Pawel

2016 年中期更新:

事情变化如此之快,以至于如果是 2017 年末,这个答案可能不再是最新的了!

初学者很快就会迷失在构建工具和工作流程的选择上,但 2016 年最新的东西是根本不使用 Bower、Grunt 或 Gulp!在 Webpack 的帮助下,你可以直接在 NPM 中做任何事情!

谷歌“npm 作为构建工具”结果:https://medium.com/@dabit3/introduction-to-using-npm-as-a-build-tool-b41076f488b0#.c33e74tsa

网页包:https://webpack.github.io/docs/installation.html

不要误会我的意思,人们使用其他工作流程,我仍然在我的遗留项目中使用 GULP(但慢慢地退出它),但这是在最好的公司中完成的,在这个工作流程中工作的开发人员赚了很多钱!

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

网页包

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-name 的快捷方式是 npm i -D package-namenpm install --save package-name 的快捷方式是 npm i -S package-name


你的回答很有主见:> With help of Webpack you can do everything directly in NPM! 这不是真的,在他的工作流程中甚至不需要 webpack
这个答案似乎做了很多假设。问题是询问 npm 和 bower 之间的区别,这个答案出于某种原因提到了 webpack。是的,webpack 是一种方法,但这个答案使它看起来像是唯一且正确的方法。例如,如果有人在使用 Polymer 1.x,标准工作流程将使用 bower,而对 webpack 的支持并不多。
答案实际上是相关的,但给出的论点并不是真的:“但这就是它的完成方式” - 好吧,什么都不应该仅仅因为它应该看起来已经完成(即由其他人完成)。金钱与工作流程的推理无关。
在 2017 年查看此答案。转到文档:“不推荐使用 webpack v1。我们鼓励所有开发人员升级到 webpack 2。请遵循我们的迁移指南或参阅 webpack 2 文档以获取更多信息。”哈哈经典的网络开发。
@user643011 当您查看迁移指南时,您会注意到大部分配置保持不变,其余的只是配置结构的外观更改。我在一个下午完成了迁移,包括一个 PR