和 之间的根本区别是什么?只是想要一些简单明了的东西。我看到我的一些同事在他们的项目中使用和互换使用。bower
npm
bower
npm
所有包管理器都有很多缺点。你只需要选择你可以忍受的。
npm 最初管理 node.js 模块(这就是包默认进入的原因),但当与 Browserify 或 webpack 结合使用时,它也适用于前端。node_modules
Bower专为前端创建,并考虑到这一点进行了优化。
npm 比 bower 大得多,包括通用 JavaScript(如国家信息或可在前端或后端使用的排序函数)。country-data
sorts
鲍尔的包裹数量要少得多。
鲍尔包括样式等。
npm 专注于 JavaScript。样式可以单独下载,也可以由类似 或 .npm-sass
sass-npm
最大的区别是 npm 执行嵌套依赖项(但默认情况下是平面的),而 Bower 需要平面依赖树(将依赖项解析的负担放在用户身上)。
嵌套依赖项树意味着您的依赖项可以有自己的依赖项,这些依赖项可以有自己的依赖项,依此类推。这允许两个模块需要同一依赖项的不同版本并且仍然可以工作。请注意,从 npm v3 开始,依赖树默认是平面的(节省空间),并且只在需要时嵌套,例如,如果两个依赖项需要自己的 Underscore 版本。
一些项目同时使用两者:它们将Bower用于前端包,将npm用于Yeoman,Grunt,Gulp,JSHint,CoffeeScript等开发人员工具。
这个答案是对辛德雷·索胡斯答案的补充。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)。
有关更多信息,我建议阅读 npm 3 的文档
TL;DR:日常使用中最大的区别不是嵌套依赖项……这是模块和全局变量之间的区别。
我认为以前的海报很好地涵盖了一些基本的区别。(npm 对嵌套依赖项的使用确实对管理大型复杂应用程序非常有帮助,尽管我认为这不是最重要的区别。
然而,我很惊讶,没有人明确解释Bower和npm之间最基本的区别之一。如果你阅读上面的答案,你会看到在npm的上下文中经常使用的“模块”这个词。但它被随意提及,好像它甚至可能只是语法差异。
但是模块与全局(或模块与“脚本”)的这种区别可能是 Bower 和 npm 之间最重要的区别。将所有内容放在模块中的npm方法要求您更改为浏览器编写Javascript的方式,几乎可以肯定是更好的。
<script>
从根本上说,Bower是关于加载普通的旧脚本文件。无论这些脚本文件包含什么,Bower 都会加载它们。这基本上意味着Bower就像在HTML中包含所有普通的旧脚本一样。<script>
<head>
因此,与您习惯的基本方法相同,但您可以获得一些不错的自动化便利:
bower install
bower.json
但除此之外,Bower并没有改变我们编写javascript的方式。关于 Bower 加载的文件内部的内容根本不需要更改。特别是,这意味着 Bower 加载的脚本中提供的资源仍将(通常,但并非总是)定义为全局变量,可从浏览器执行上下文中的任何位置使用。
Node land 中的所有代码(以及通过 npm 加载的所有代码)都被结构化为模块(具体来说,作为 CommonJS 模块格式的实现,或者现在作为 ES6 模块)。因此,如果您使用 NPM 来处理浏览器端依赖项(通过 Browserify 或其他执行相同工作的东西),您将以与 Node 相同的方式构建代码。
比我更聪明的人已经解决了“为什么是模块?”的问题,但这里有一个胶囊摘要:
window.variable
this.variable
this
window
对我来说,前端代码模块的使用归结为:在更窄的上下文中工作,更容易推理和测试,并且对正在发生的事情有更大的确定性。
学习如何使用 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】栏目查找您需要的精美模板。