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

IT技术 javascript gruntjs bower
2021-02-18 21:58:21

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

问题:当我想添加一个包(并将依赖项检入到 git 中)时,它属于哪里 - intopackage.json或 into bower.json

根据我收集的信息,
运行bower install将获取包并将其放入/vendor目录中,
运行npm install它将获取并放入/node_modules目录中。

这个 SO 答案说 bower 是用于前端的,而 npm 是用于后端的。
Ember-app-kit乍一看似乎坚持这种区别......但是 gruntfile 中用于启用某些功能的说明给出了两个明确的命令,所以我在这里完全感到困惑。

直觉上我猜

  1. npm install --save-dev package-name相当于将 package-name 添加到我的 package.json

  2. bower install --save package-name可能与将包添加到我的bower.json并运行bower install 相同

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

2个回答

Npm 和 Bower 都是依赖管理工具。但两者之间的主要区别是npm 用于安装 Node js module,而 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 文件进行 linting (jshint)
  3. 编译更少的文件(grunt-contrib-less)

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

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

问题 1

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

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

问题2

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

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

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

或者

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

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

您可以通过任何一种方式执行此操作,不会有实质性差异。

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

2016 年年中的更新

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

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

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

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

  • 网络包
  • NPM 作为构建工具(没有 Gulp、Grunt 或 Bower)
  • 与 Redux react
  • 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

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