首页 > JavaScript >  JavaScript 中 Bower 和 npm 有什么区别?

 JavaScript 中 Bower 和 npm 有什么区别?

上一篇 下一篇

和 之间的根本区别是什么?只是想要一些简单明了的东西。我看到我的一些同事在他们的项目中使用和互换使用。bowernpmbowernpm

分割线

网友回答:

所有包管理器都有很多缺点。你只需要选择你可以忍受的。

历史

npm 最初管理 node.js 模块(这就是包默认进入的原因),但当与 Browserify 或 webpack 结合使用时,它也适用于前端。node_modules

Bower专为前端创建,并考虑到这一点进行了优化。

回购的大小

npm 比 bower 大得多,包括通用 JavaScript(如国家信息或可在前端或后端使用的排序函数)。country-datasorts

鲍尔的包裹数量要少得多。

样式等的处理

鲍尔包括样式等。

npm 专注于 JavaScript。样式可以单独下载,也可以由类似 或 .npm-sasssass-npm

依赖关系处理

最大的区别是 npm 执行嵌套依赖项(但默认情况下是平面的),而 Bower 需要平面依赖树(将依赖项解析的负担放在用户身上)。

嵌套依赖项树意味着您的依赖项可以有自己的依赖项,这些依赖项可以有自己的依赖项,依此类推。这允许两个模块需要同一依赖项的不同版本并且仍然可以工作。请注意,从 npm v3 开始,依赖树默认是平面的(节省空间),并且只在需要时嵌套,例如,如果两个依赖项需要自己的 Underscore 版本。

一些项目同时使用两者:它们将Bower用于前端包,将npm用于Yeoman,Grunt,Gulp,JSHint,CoffeeScript等开发人员工具。


资源

  • 嵌套依赖项 – 深入了解node_modules工作方式的原因

分割线

网友回答:

这个答案是对辛德雷·索胡斯答案的补充。npm 和 Bower 之间的主要区别在于它们处理递归依赖的方式。请注意,它们可以在单个项目中一起使用。

关于 npm 常见问题解答:(archive.org 6 年 2015 月 <> 日的链接)

如果不嵌套
依赖关系,就很难避免依赖关系冲突。这是 npm 工作方式的基础,并且已被
证明是一种非常成功的方法。

在鲍尔主页上:

Bower针对前端进行了优化。Bower 使用平面依赖
树,每个包只需要一个版本,从而将页面负载
降至最低。

简而言之,npm 的目标是稳定性。Bower的目标是最小的资源负载。如果你画出依赖结构,你将看到这个:

NPM:

project root
[node_modules] // default directory for dependencies
 -> dependency A
 -> dependency B
    [node_modules]
    -> dependency A

 -> dependency C
    [node_modules]
    -> dependency B
      [node_modules]
       -> dependency A 
    -> dependency D

如您所见,它以递归方式安装一些依赖项。依赖项 A 已安装三个实例!

凉亭:

project root
[bower_components] // default directory for dependencies
 -> dependency A
 -> dependency B // needs A
 -> dependency C // needs B and D
 -> dependency D

在这里,您可以看到所有唯一的依赖项都在同一级别上。

那么,为什么要费心使用 npm呢?

npm 会安装此依赖项的两个版本,因此无论如何它都可以工作,但 Bower 会给你一个冲突,因为它不喜欢重复(因为在网页上加载相同的资源效率非常低且成本高昂,也可能给出一些严重的错误)。您必须手动选择要安装的版本。这可能会使其中一个依赖项中断,但无论如何您都需要修复此问题。

因此,常见的用法是 Bower 用于您想要在网页上发布的包(例如运行时,您可以避免重复),并使用 npm 进行其他内容,例如测试、构建、优化、检查等。(例如,开发时间,重复不太重要)。

npm 3 的更新:

与鲍尔相比,npm 3 仍然做不同的事情。它将全局安装依赖项,但仅适用于它遇到的第一个版本。其他版本安装在树中(父模块,然后是node_modules)。

  • [node_modules]
    • A 版 v1.0
    • B 版 v1.0
      • dep A v1.0 (使用根版本)
    • C 版 v1.0
      • dep A v2.0(此版本与根版本不同,因此它将是嵌套安装)

有关更多信息,我建议阅读 npm 3 的文档

分割线

网友回答:

TL;DR:日常使用中最大的区别不是嵌套依赖项……这是模块和全局变量之间的区别。

我认为以前的海报很好地涵盖了一些基本的区别。(npm 对嵌套依赖项的使用确实对管理大型复杂应用程序非常有帮助,尽管我认为这不是最重要的区别。

然而,我很惊讶,没有人明确解释Bower和npm之间最基本的区别之一。如果你阅读上面的答案,你会看到在npm的上下文中经常使用的“模块”这个词。但它被随意提及,好像它甚至可能只是语法差异。

但是模块与全局(或模块与“脚本”)的这种区别可能是 Bower 和 npm 之间最重要的区别。将所有内容放在模块中的npm方法要求您更改为浏览器编写Javascript的方式,几乎可以肯定是更好的。

鲍尔方法:全球资源,如标签<script>

从根本上说,Bower是关于加载普通的旧脚本文件。无论这些脚本文件包含什么,Bower 都会加载它们。这基本上意味着Bower就像在HTML中包含所有普通的旧脚本一样。<script><head>

因此,与您习惯的基本方法相同,但您可以获得一些不错的自动化便利:

  • 过去,您需要在项目存储库中包含 JS 依赖项(在开发时),或通过 CDN 获取它们。现在,您可以跳过存储库中额外的下载权重,并且有人可以在本地快速立即获得所需的内容。bower install
  • 如果 Bower 依赖项随后在其 中指定了自己的依赖项,则也会为您下载这些依赖项。bower.json

但除此之外,Bower并没有改变我们编写javascript的方式。关于 Bower 加载的文件内部的内容根本不需要更改。特别是,这意味着 Bower 加载的脚本中提供的资源仍将(通常,但并非总是)定义为全局变量,可从浏览器执行上下文中的任何位置使用。

npm 方法:常见的 JS 模块,显式依赖注入

Node land 中的所有代码(以及通过 npm 加载的所有代码)都被结构化为模块(具体来说,作为 CommonJS 模块格式的实现,或者现在作为 ES6 模块)。因此,如果您使用 NPM 来处理浏览器端依赖项(通过 Browserify 或其他执行相同工作的东西),您将以与 Node 相同的方式构建代码。

比我更聪明的人已经解决了“为什么是模块?”的问题,但这里有一个胶囊摘要:

  • 模块中的任何内容都有效地被命名为命名空间,这意味着它不再是全局变量,并且您不会无意中意外引用它。
  • 模块中的任何内容都必须有意注入到特定上下文(通常是另一个模块)中才能使用它
  • 这意味着您可以在应用程序的各个部分拥有同一外部依赖项(例如 lodash)的多个版本,并且它们不会发生冲突/冲突。(这种情况经常发生,因为您自己的代码想要使用依赖项的一个版本,但其中一个外部依赖项指定了另一个冲突的版本。或者,您有两个外部依赖项,每个依赖项都需要不同的版本。
  • 由于所有依赖项都是手动注入到特定模块中的,因此很容易对它们进行推理。你知道一个事实:“在处理这个问题时,我唯一需要考虑的代码是我有意选择在这里注入的代码”。
  • 因为即使是注入模块的内容也封装在你分配给它的变量后面,并且所有代码都在有限的范围内执行,所以意外和冲突变得非常不可能。来自您的依赖项之一的某些内容在您没有意识到的情况下意外地重新定义全局变量的可能性要小得多,或者您会这样做。(它可能会发生,但您通常必须不遗余力地去做,例如.仍然容易发生的一个事故是分配,没有意识到这实际上是在当前的背景下。window.variablethis.variablethiswindow
  • 当您想要测试单个模块时,您可以非常容易地知道:究竟还有什么(依赖项)影响了模块内部运行的代码?而且,由于您显式注入了所有内容,因此可以轻松模拟这些依赖项。

对我来说,前端代码模块的使用归结为:在更窄的上下文中工作,更容易推理和测试,并且对正在发生的事情有更大的确定性。


学习如何使用 CommonJS/Node 模块语法只需要大约 30 秒。在给定的JS文件(将是一个模块)中,您首先声明要使用的任何外部依赖项,如下所示:

var React = require('react');

在文件/模块中,您可以执行通常所做的任何操作,并创建一些要向外部用户公开的对象或函数,并调用它。myModule

在文件末尾,您可以导出要与世界共享的任何内容,如下所示:

module.exports = myModule;

然后,要在浏览器中使用基于 CommonJS 的工作流,您将使用 Browserify 等工具来获取所有这些单独的模块文件,在运行时封装它们的内容,并根据需要将它们相互注入。

而且,由于 ES6 模块(您可能会使用 Babel 或类似模块转换为 ES5)正在获得广泛的接受,并且可以在浏览器或 Node 4.0 中工作,我们也应该提到这些模块的良好概述。

有关使用此幻灯片中的模块的模式的更多信息。


编辑(2017年<>月):Facebook的Yarn是如今npm的一个非常重要的潜在替代品/补充:快速,确定性,离线包管理,建立在npm给你的东西之上。对于任何JS项目来说,都值得一看,特别是因为它很容易换入/换出。


编辑(2019 年 <> 月)
“鲍尔终于被弃用了。故事结束。(H/T:@DanDascalescu,下面,为了简洁的总结。

而且,虽然 Yarn 仍然活跃,但一旦它采用了 Yarn 的一些关键功能,它的很多动力又回到了 npm。

模板简介:该模板名称为【 JavaScript 中 Bower 和 npm 有什么区别?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【JavaScript】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 301次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 04-19
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信素材 企业网站 微信公众平台 单页式简历模板 微信模板 响应式 微信文章 html5 自适应 微信图片
您可能会喜欢的其他模板