好家伙,学习新工具 

 

1.为什么我们需要包管理器?

关于npm我们已经知道了,这是我们项目的包管理器,

我们现在用的无比顺手的工具,都是在无数的竞争中杀出来的,他们淘汰了无数的产品

 

首先,倘若我们不使用npm,那么我们应该如何去新建一个前端项目?

纯手工,把我们项目需要的项目一个个下载到我们的项目里面

手动创建项目意味着您需要手动管理项目的依赖和文件结构,包括下载和引入任何所需的库或框架。

想想都可怕,再加上各种bug

我们新建一个项目可能需要?半个小时左右

 

于是我们的好帮手出现了,包管理器npm

 

我们把我们的配置清单给npm,随后,npm帮我们下载我们项目依赖的包

于是我们从30分钟优化到1分钟

npm真是太伟大了

 

2.NPM出现问题

但随后,NPM又出现了一些问题

2.1.安装太慢

新项目拿到手,安装依赖太慢

npm install

 

npm 2会安装每一个包所依赖的所有依赖项。如果我们有这么一个项目,它依赖项目A,项目A依赖项目B,项目B依赖项目C,那么依赖树将如下所示:

node_modules
- package-A
-- node_modules
--- package-B
----- node_modules
------ package-C
-------- some-really-really-really-long-file-name-in-package-c.js

这个结构可能会很长。这对于Windows来说却是个破坏性的东西,因为有很多程序无法处理超过260个字符的文件路径名。

npm 3采用了扁平依赖关系树来解决这个问题,所以我们的3个项目结构现在看起来如下所示:

node_modules
- package-A
- package-B
- package-C
-- some-file-name-in-package-c.js
这样,一个原来很长的文件路径名就从./node_modules/package-A/node_modules/package-B/node-modules/some-file-name-in-package-c.js
变成了/node_modules/some-file-name-in-package-c.js。

这种方法的缺点是,npm必须首先遍历所有的项目依赖关系,然后再决定如何生成扁平的node_modules目录结构。

npm必须为所有使用到的模块构建一个完整的依赖关系树,这是一个耗时的操作,是npm安装速度慢的一个很重要的原因。

 

2.2.无法保持一致性

想像一下去和小黄一起开发一个项目登陆页面,然后,你们在不同的时间安装了依赖包,

而碰巧,其中一个包更新了,14.2.1变成了14.2.2,或许是其中的一个组件框的样式改变了,

于是你会发现,你两的项目跑起来会有微妙的差别,当然了,也有可能是其他的各种各样严重的bug

总之,依赖包的版本不统一,是一个非常大的问题,可能会导致严重的问题

 

3.Yarn出现

于是针对这两个问题,

Yarn出现了,他很好地解决的npm存在的一些问题

yarn更快(为什么?)

1.并行安装:Yarn 采用并行安装的方式,可以同时下载多个依赖包,而 npm 是串行安装,只能一个一个地下载。这意味着当你使用 Yarn 时,依赖包的安装过程更加高效。

2.本地缓存:Yarn 有一个本地缓存目录,用于存储已经下载过的依赖包。当你需要安装同一个依赖包的不同版本时,Yarn 可以直接从本地缓存中获取,而无需重新下载。这可以节省大量的下载时间。

3.精确的依赖管理:Yarn 会生成一个锁文件 (yarn.lock),用于确保每个开发者在不同环境下都使用相同版本的依赖包。这意味着在安装依赖包时,Yarn 可以更加准确地确定需要使用的版本,减少了版本冲突和不一致性问题。

 

在后来,

有了yarn的压力之后,npm做了一些类似的改进(对手起来了,再不与时俱进要就要被淘汰了)

1. 默认新增了类似yarn.lock的 package-lock.json,同样用于处理依赖包版本一致性的问题
2. git 依赖支持优化:这个特性在需要安装大量内部项目(,或需要使用某些依赖的未发布版本时很有用。

3.npm是有本地缓存的,它保存了已经下载的每个版本的压缩包。本地缓存的内容可以通过-npm cache ls命令进行查看。

本地缓存的设计有助于减少安装时间。

那么最终该如何选择呢?

1. 性能需求:如果你对构建速度和依赖包下载速度有较高的需求,可以使用Yarn。Yarn在处理大型项目和并发操作时通常更高效。

2. 生态系统和兼容性:Npm是JavaScript生态系统的默认选择,很多项目都使用Npm作为包管理工具,并且它与其他工具和服务的兼容性较好。

如果你的项目依赖于特定的Npm插件或服务,或者与其他使用Npm的项目进行交互,那么使用Npm可能更方便。

3. 社区支持和文档:Npm和Yarn都有庞大的社区和文档资源,但是Npm在这方面可能更加成熟和全面。

如果你更倾向于使用广泛支持的工具,并且更容易找到相关的教程、示例和问题解答,那么选择Npm可能是一个不错的选择。

4. 团队合作:如果你在一个团队中工作,建议与团队成员协商并讨论选择。考虑到团队中其他开发者的熟悉程度和偏好,可以决定是否使用Npm还是Yarn。

根据你的性能需求、生态系统要求、社区支持和团队合作等因素来衡量,选择适合你项目的工具。

无论是Npm还是Yarn,它们都是广泛使用的可靠工具,并且都能满足大部分项目的需求。

最后,yarn的安装方式

 (用你的平台安装我,这何尝不是一种NTR)

 

包管理工具npm和Yarn的区别,我们该如何选择?的更多相关文章

  1. 主流包管理工具npm、yarn、cnpm、pnpm之间的区别与联系——原理篇

    接触 node 之后,一直使用npm包管理工具, cnpm 一开始会用一些,但是并没有觉得比 npm 快得多,使用 cnpm 的时候还经常安装不成功,只能再用 npm 安装一遍,渐渐的就弃用了 cnp ...

  2. 更换包管理工具npm为yarn

    官网:https://yarnpkg.com/zh-Hans/ 主要考虑: 1. npm管理安装模块依赖的版本不太方便,容易在删除node_modules重新install或在其他机器上新安装时, 安 ...

  3. JavaScript 包管理工具npm 和yarn 对比

  4. NodeJS包管理工具——npm入门

    如今每个语言体系中都有一个包管理工具,PHP的Composer,Ruby的gem,Python的pip,Java的Maven……当然还有Node.js的npm.有的人会奇怪为何要引入又一个新东西来让我 ...

  5. 【前端】NodeJs包管理工具NPM

    NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS部署上的很多问题. 测试是否安装成功,出现版本提示表示安装成功. npm -v NPM常用命令 官方文档:https://www.npm ...

  6. node.js开发 npm包管理工具 npm 和 cnpm区别

    npm 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用. 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用 np ...

  7. nodejs包管理工具npm

    用Node.js安装模块 在某个项目中单独安装的时候,npm会下载所有的文件到你项目中的一个叫做node_modules的文件夹内 全局模块会被安装到{prefix}/lib/node_modules ...

  8. Node包管理工具

    Node包管理工具 只是简单的介绍一些工具的使用,有利于开发过程.除了介绍Node包管理工具,还介绍了前端打包工具,前端模块管理工具 Node包管理工具:    --npm    --cnpm    ...

  9. 包管理工具(npm、yarn)

    npm包管理工具 1. npm的包安装分为本地安装(local).全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已. 2. 这两种安装方式的区别: 本地安装(安装在命令行运行所在 ...

  10. Node.js之包与npm包管理工具

    Node.js之包与npm包管理工具 1.Node.js中的包 1.1在一个包中包含如下内容: package.json:对包进行描述 在bin子目录中存放二进制文件 在lib子目录中存放JavaSc ...

随机推荐

  1. Go语言:两种常见的并发模型

    Go语言:两种常见的并发模型 在并发编程中,须要精确地控制对共享资源的访问,Go语言将共享的值通过通道传递 并发版"Hello World" 使用goroutine来打印" ...

  2. 【LeetCode动态规划#11】打家劫舍系列题(涉及环结构和树形DP的讨论)

    打家劫舍 力扣题目链接(opens new window) 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻 ...

  3. Java的static修饰符

    静态域 如果将域定义为 static,每个类中只有一个这样的域.而每一个对象对于所有的实例域却都有自己的一份拷贝.例如,假定需要给每一个雇员赋予唯一的标识码.这里给 Employee 类添加一个实例域 ...

  4. 小程序TS报错 "无法重新声明块范围变量。此处也声明了xx "

    初学者简单的方法,目前还没有遇到问题 想法很简单,当export导出,骗eslint认为是一个模块. 如果有新的问题欢迎留言,我也在学习 1 import utilsApi from '../util ...

  5. 2023-03-29:如何高效计算三条线路选择方案?小A的旅行线路规划问题

    2023-03-29:第一行有一个正整数n(3<=n<=100000),代表小A拟定的路线数量 第二行有n个正整数,第i个代表第i条路线的起始日期 第三行有n个正整数,第i个代表第i条路线 ...

  6. 简要介绍django框架

    Django是一个高级的Python Web框架,它鼓励快速开发和干净.实用的设计. Django遵循MVC(模型-视图-控制器)设计模式,使得开发者能够更轻松地组织代码和实现功能.以下是Django ...

  7. adb知识

    一.原理: adb客户端:能够对adb服务下发指令或命令的工具 server服务端:adb.exe执行之后的进程,表示adb的服务端,通过服务端与手机上的adb守护进程进行通信 adb守护进程 : 随 ...

  8. go 实现ringbuffer以及ringbuffer使用场景介绍

    ringbuffer因为它能复用缓冲空间,通常用于网络通信连接的读写,虽然市面上已经有了go写的诸多版本的ringbuffer组件,虽然诸多版本,实现ringbuffer的核心逻辑却是不变的.但发现其 ...

  9. 如何解决PyCharm中运行不了python代码的问题

    一.问题分析 一般是新手小白才会出现这个问题.刚入门python或者Web自动化测试的集美们很多都会选择使用PyCharm来运行python,但是下载安装完PyCharm后,新建了一个python项目 ...

  10. 这就是艺术,优雅的二维码生成器「GitHub 热点速览」

    平时如果没有需要一般那团黑乎乎的二维码,估计路过的人看见第一眼就不会再看第二眼.但是假若,它是个帅哥靓妹,估计就不同了,更别提像是艺术画一样,将编码图案融入到画里的二维码生成器 qrbtf 作者的新作 ...