Yarn vs npm的大同小异Yarn是什么?
Yarn vs npm的大同小异&Yarn是什么?
- 一、Yarn、npm是什么?
- 二、Yarn vs npm:特性差异
- 总结
一、Yarn、npm是什么?
npm是Node.js的包管理器,是由Chris Korda维护。
npm,它全称为Node Package Manager,是随同Node.js一起安装的包管理工具。主要功能包括:
- 管理依赖:帮助开发者安装、卸载和管理项目中用到的各种软件包和库。
- 简化部署:通过自动化的方式解决Node.js代码部署中遇到的依赖问题。
- 分发代码:允许用户从NPM服务器下载别人编写的第三方包到本地使用。
总的来说,npm作为Node.js生态的一个重要组成部分,为JavaScript开发者提供了一个丰富的软件包生态系统,极大地促进了开发效率和代码共享。
Yarn:
是Facebook、Google、Exponent 和 Tilde 联合推出了一个新的 JS 包管理工具 — Yarn,正如官方文档
中写的,Yarn 是为了弥补 npm 的一些缺陷而出现的:
- npm 安装包(packages)的速度不够快,拉取的 packages 可能版本不同
- npm 允许在安装 packages 时执行代码,这就埋下了安全隐患
但是,Yarn 没想要完全替代 npm,它只是一个新的 CLI 工具,拉取的 packages 依然来自 npm 仓库。仓库本身不会变,所以获取或者发布模块的时候和原来一样。
那么既然都是从相同的拉取第三方包,而且二者作用几乎相同,那为什么要退出Yarn呢,请看下面它们的差异!
二、Yarn vs npm:特性差异
(1)yarn.lock 文件:解决版本一致问题
-
npm 和 Yarn 都是通过 package.json 记录项目需要拉取的依赖模块,不过在使用时,往往 package.json 中模块的版本号不太会写得非常确切,通常是定个版本范围。这样你就能自行选择使用模块的大版本或者小版本,也允许 npm 拉取模块最新的修复了 bug 的版本。
-
在理想的语义化版本世界中,新版是不会有颠覆旧版本的改变,然而现实并非如此。这就导致了使用 npm 拉取依赖时,即使用的是相同的 package.json,在不同的设备上拉到的 packages 版本不一,这就可能为项目引入 bug。
-
为了防止拉取到不同的版本,Yarn 有一个锁定文件 (lock file) 记录了被确切安装上的模块的版本号。每次只要新增了一个模块,Yarn 就会创建(或更新)yarn.lock 这个文件。这么做就保证了,每一次拉取同一个项目依赖时,使用的都是一样的模块版本。
-
npm 其实也有办法实现处处使用相同版本的 packages,但需要开发者执行 npm shrinkwrap 命令。这个命令将会生成一个锁定文件,在执行 npm install 的时候,该锁定文件会先被读取,和 Yarn 读取 yarn.lock 文件一个道理。npm 和 Yarn 两者的不同之处在于,Yarn 默认会生成这样的锁定文件,而 npm 要通过 shrinkwrap 命令生成 npm-shrinkwrap.json 文件,只有当这个文件存在的时候,packages 版本信息才会被记录和更新。
-
yarn.lock 文档
-
npm shrinkwrap 文档
(2)并行安装
无论 npm 还是 Yarn 在执行包的安装时,都会执行一系列任务。
- npm 是按照队列执行每个 package,也就是说必须要等到当前 package 成功安装之后,才能继续后面的安装。
- 而 Yarn 是同步执行所有任务,提高了性能。
通过拉取 express 依赖,比较了 npm 和 Yarn 的效率,在没有用任何锁定文件(也就是没有缓存)的前提下,一共安装 42 个依赖:
- npm 耗时 9 秒
- Yarn 耗时 1.37 秒
所以 npm 和 Yarn 在安装包的速度差异和要安装的包个数强相关,不过不管怎么样,Yarn 都比 npm 要快。
(3)输出更简洁
- npm 的输出信息比较冗长。在执行 npm install 的时候,命令行里会不断地打印出所有被安装上的依赖。
- 相比之下,Yarn 简洁太多:默认情况下,结合了 emoji (Windows 上 emoji 不可见)直观且直接地打印出必要的信息,也提供了一些命令供开发者查询额外的安装信息。
(4)CLI 区别
相比于 npm 的命令,Yarn 命令有增有减还有一些更改。
-
yarn global
- npm 的全局操作命令要加上 -g 或者 --global 参数;
- Yarn 的全局命令则需要加上 global。和 npm 类似,项目特定的依赖,就不需要全局安装了。
当执行
yarn add、yarn bin、yarn ls 和 yarn remove
时添加 global 前缀才是有全局作用。除了 yarn add 之外,其他三个命令和 npm 的一样。
如:yarn global add nodemon --prefix /usr/local
-
yarn install
npm install 命令安装的是 package.json 中的依赖,如果开发者在 package.json 中添加了新的依赖,npm install 也一样安装。然而,yarn install 会优先安装 yarn.lock 中记录的依赖,没有这样的锁定文件时,才会去安装 package.json 中的依赖。
- yarn install 文档
- npm install 文档
-
yarn add [–dev]
和 npm install 类似,yarn add 命令允许你添加并安装依赖。通过这个命令添加的依赖都会被自动加到 package.json 中,和我们在 npm 命令中使用 --save 参数一样。Yarn 的-dev 则等同于 npm 的 --save-dev。- yarn add 文档
- npm install 文档
-
yarn licenses [ls|generate-disclaimer]
yarn licenses ls 用于罗列出所有被安装的 package 所持有的执照情况。yarn licenses generate-disclaimer 将生成一个对所有依赖的免责声明。有些执照要求开发者一定要在项目中包含这些它们,这个命令就是为这样的场景存在的。- yarn licenses 文档
-
yarn why
这条命令能帮助开发者理清安装的 package 之间的关系。拉取了各种依赖以后,有些 package 是你显式安装的,有些包则是递归依赖的。- yarn why 文档
-
yarn upgrade [package]
这条命令将根据 package.json 将 package 升级到最新版本,并更新 yarn.lock,和 npm update 相似。
有意思的是,如果指定了 [package] 参数,Yarn 会将 package 升级到最新版本,并更新 package.json 中该 package 的版本号字段。- yarn upgrade 文档
-
yarn generate-lock-entry
这条命令将会生成一份基于 package.json 的 yarn.lock 文件,作用和 npm shrinkwrap 类似。不过由于执行 yarn add andyarn upgrade 时都会更新 yarn.lock 文件,所以要慎重执行 yarn generate-lock-entry 命令- yarn generate-lock-entry 文档
- npm shrinkwrap 文档
总结
目前看来 Yarn 要比 npm 更好用:默认就有锁定文件、更快速地安装依赖以及依赖的更新会自动同步到 package.json 文件中。从 npm 迁移到 Yarn 成本几乎为零,以上优点都让 Yarn 成为了目前 npm 最好的替代品。
相关文章:
Yarn vs npm的大同小异Yarn是什么?
Yarn vs npm的大同小异&Yarn是什么? 一、Yarn、npm是什么?二、Yarn vs npm:特性差异总结 一、Yarn、npm是什么? npm是Node.js的包管理器,是由Chris Korda维护。 npm,它全称为Node Package Manager,是…...
1.Godot引擎|场景|节点|GDS|介绍
Godot介绍 Godot是一款游戏引擎 可以通过在steam商城免费下载 初学者和编程基础稍差的推荐学习使用GDScript,和python有些相似 Godot节点 Godot的开发思想——围绕节点 节点的特征与优势 最常用基本的开发组件大部分都具有具体的功能,如图片…...
springboot3 redis 实现分布式锁
分布式锁介绍 分布式锁是一种在分布式系统中用于控制不同节点上的进程或线程对共享资源进行互斥访问的技术机制。 在分布式环境中,多个服务可能同时访问和操作共享资源,如数据库、文件系统等。为了保持数据的一致性和完整性,需要确保在同一…...
2024年第十四届MathorCup数学应用挑战赛A题思路分享(妈妈杯)
A题 移动通信网络中PCI规划问题 物理小区识别码(PCI)规划是移动通信网络中下行链路层上,对各覆盖小区编号进行合理配置,以避免PCI冲突、PCI混淆以及PCI模3干扰等现象。PCI规划对于减少物理层的小区间互相干扰(ICI),增加物理下行控制信道(PDCCH)的吞吐量有着重要的作用,尤其…...
运动听歌哪款耳机靠谱?精选五款热门开放式耳机
随着人们对运动健康的重视,越来越多的运动爱好者开始关注如何在运动中享受音乐。开放式蓝牙耳机凭借其独特的设计,成为了户外运动的理想选择。它不仅让你在运动时能够清晰听到周围环境的声音,保持警觉,还能让你在需要时与他人轻松…...
Kubernetes学习笔记12
k8s核心概念:控制器: 我们删除Pod是可以直接删除的,如果生产环境中的误操作,Pod同样也会被轻易地被删除掉。 所以,在K8s中引入另外一个概念:Controller(控制器)的概念,…...
Qt Designer 控件箱中的控件介绍及布局比列分配
控件箱介绍 Qt Designer的控件箱(Widget Box)包含了各种常用的控件,用户可以通过拖放的方式将这些控件添加到窗体设计器中,用于构建用户界面。以下是一些常见控件箱中的控件及其功能的讲解: 1.基本控件&#…...
蓝桥集训之三国游戏
蓝桥集训之三国游戏 核心思想:贪心 将每个事件的贡献值求出 降序排序从大到小求和为正是即可 #include <iostream>#include <cstring>#include <algorithm>using namespace std;typedef long long LL;const int N 100010;int a[N],b[N],c[N];…...
MySQL知识整理
MySQL知识整理 基础第一讲:基础架构:一条SQL查询语句是如何执行的?架构尽量减少长连接的原因和方案为什么尽量不要依赖查询缓存 索引第四讲:深入浅出索引(上)第五讲:深入浅出索引(下…...
代码随想录算法训练营第36天| 435. 无重叠区间、 763.划分字母区间*、56. 合并区间
435. 无重叠区间 力扣题目链接 代码 示例代码 class Solution { public:// 按照区间右边界排序static bool cmp (const vector<int>& a, const vector<int>& b) {return a[1] < b[1];}int eraseOverlapIntervals(vector<vector<int>>&a…...
SpringBoot整合Nacos
文章目录 nacosnacos下载nacos启动nacos相关配置demo-dev.yamldemo-test.yamluser.yaml 代码pom.xmlUserConfigBeanAutoRefreshConfigExampleValueAnnotationExampleDemoApplicationbootstrap.yml测试结果补充.刷新静态配置 nacos nacos下载 下载地址 一键傻瓜试安装即可,官…...
vue3 浅学
一、toRefs 问题: reactive 对象取出的所有属性值都是⾮响应式的 解决: 利⽤ toRefs 可以将⼀个响应式 reactive 对象的所有原始属性转换为 响应式的 ref 属性 二、hook函数 将可复⽤的功能代码进⾏封装,类似与vue2混⼊。 三、ref:获取元素或者组件 let …...
三小时使用鸿蒙OS模仿羊了个羊,附源码
学习鸿蒙arkTS语言,决定直接通过实践的方式上手,而不是一点点进行观看视频再来实现。 结合羊了个羊的开发思路,准备好相应的卡片素材后进行开发。遇到了需要arkTS进行解决的问题,再去查看相应的文档。 首先需要准备卡片对应的图片…...
如何使用 ArcGIS Pro 制作热力图
热力图是一种用颜色表示数据密度的地图,通常用来显示空间分布数据的热度或密度,我们可以通过 ArcGIS Pro 来制作热力图,这里为大家介绍一下制作的方法,希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的POI数…...
SpringBoot之集成Redis
SpringBoot之集成Redis 一、Redis集成简介二、集成步骤2.1 添加依赖2.2 添加配置2.3 项目中使用 三、工具类封装四、序列化 (正常都需要自定义序列化)五、分布式锁(一)RedisTemplate 去实现场景一:单体应用场景二&…...
mybatis-plus与mybatis同时使用别名问题
在整合mybatis和mybatis-plus的时候发现一个小坑,单独使用mybatis,配置别名如下: #配置映射文件中指定的实体类的别名 mybatis.type-aliases-packagecom.jk.entity XML映射文件如下: <update id"update" paramete…...
MySQL基础知识——MySQL日志
一条查询语句的执行过程一般是经过连接器、 分析器、 优化器、 执行器等功能模块, 最后到达存储引擎。 那么, 一条更新语句的执行流程又是怎样的呢? 下面我们从一个表的一条更新语句进行具体介绍: 假设这个表有一个主键ID和一个…...
uniapp 地图分幅网格生成 小程序基于map组件
// 获取小数部分 const fractional function(x) {x Math.abs(x);return x - Math.floor(x); } const formatInt function(x, len) {let result x;len len - result.length;while (len > 0) {result 0 result;len--;}return result; }/*** 创建标准分幅网格* param …...
python项目练习——22、人脸识别软件
功能分析: 人脸检测: 识别图像或视频中的人脸,并标记出人脸的位置和边界框。 人脸识别: 识别人脸的身份或特征,通常使用已知的人脸数据库进行训练,然后在新的图像或视频中识别出人脸并匹配到相应的身份。 表情识别: 识别人脸的表情,如高兴、悲伤、愤怒等,并给出相应…...
Linux中账号登陆报错access denied
“Access denied” 是一个权限拒绝的错误提示,意味着用户无法获得所请求资源的访问权限。出现 “Access denied” 错误的原因可以有多种可能性,包括以下几种常见原因: 错误的用户名或密码:输入的用户名或密码不正确,导…...
python语言之round(num, n)小数四舍五入
文章目录 python round(num, n)小数四舍五入python round(num, n)基础银行家舍入(Bankers Rounding)利息被银行四舍五入后,你到底是赚了还是亏了? python小数位的使用decimal模块四舍五入(解决round 遇5不进) python round(num, n…...
安全风险攻击面管理如何提升企业网络弹性?
从研究人员近些年的调查结果来看,威胁攻击者目前非常善于识别和利用最具有成本效益的网络入侵方法,这就凸显出了企业实施资产识别并了解其资产与整个资产相关的安全态势的迫切需要。 目前来看,为了在如此复杂的网络环境中受到最小程度上的网络…...
常用的几款性能测试软件
Apache JMeter是一款免费、开源的性能测试工具,广泛应用于Web应用程序和服务的性能测试。它支持模拟多种不同类型的负载,可以测试应用程序在不同压力下的性能表现,并提供丰富的图表和报告来分析测试结果。 优点: 免费且开源&…...
谷歌google浏览器无法更新Chrome至最新版本怎么办?浏览器Chrome无法更新至最新版本
打开谷歌google浏览器提示:无法更新Chrome,Chrome无法更新至最新版本,因此您未能获得最新的功能和安全修复程序。点击「重新安装Chrome」后无法访问此网站,造成谷歌浏览器每天提示却无法更新Chrome至最新版本。 谷歌google浏览器无…...
认识异常(1)
❤️❤️前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&a…...
C++矩阵
C矩阵【基本】(will循环) #include<iostream> #include<string.h> using namespace std; int main() {int a[100][100]{0};int k 1;int i 0;int j 0;while(k<100){if(j>10){j0;i;}a[i][j]k;j;k;}i 0;j 0;while(true){if(i 9&am…...
解锁智能未来:用Ollama开启你的本地AI之旅
Ollama是一个用于在本地运行大型语言模型(LLM)的开源框架。它旨在简化在Docker容器中部署LLM的过程,使得管理和运行这些模型变得更加容易。Ollama提供了类似OpenAI的API接口和聊天界面,可以非常方便地部署最新版本的GPT模型并通过…...
CSS实现卡片在鼠标悬停时突出效果
在CSS中,实现卡片在鼠标悬停时突出,通常使用:hover伪类选择器。 :hover伪类选择器用于指定当鼠标指针悬停在某个元素上时,该元素的状态变化。通过:hover选择器,你可以定义鼠标悬停在元素上时元素的样式,比如改变颜色、…...
GPT建模与预测实战
代码链接见文末 效果图: 1.数据样本生成方法 训练配置参数: --epochs 40 --batch_size 8 --device 0 --train_path data/train.pkl 其中train.pkl是处理后的文件 因此,我们首先需要执行preprocess.py进行预处理操作,配置参数…...
传统方法(OpenCV)_车道线识别
一、思路 基于OpenCV的库:对视频中的车道线进行识别 1、视频处理:视频读取 2、图像转换:图像转换为灰度图 3、噪声去除:高斯模糊对图像进行去噪,提高边缘检测的准确性 4、边缘检测:Canny算法进行边缘检测…...
韩国什么网站是专做皮草的/宁波seo推广哪家好
先看一下效果 选择分组 选择服务器 开始链接 为什么写 之前写过一个字符界面的链接工具,但是看起来比较简陋,他是这个样子的: 看起来十分不好看。后来在网上看到shell中有一个whiptail工具可以制作各种命令行里的工具,于是就搜索了…...
电子购物网站收藏功能设计/免费b站推广网站短视频
我们都知道jq中的这几个方法是可以传递选择器的,而且选择器的功能是非常强大的。 原生的js也想实现,该如何做呢? 暂时提供一下思路,还没做。 比如,parents,我们可以先用递归,取出所有的父级&…...
做兼职有哪些靠谱的网站有哪些/站长之家seo工具
MySQL的热备(物理备份)可以采取全备加增量备份的方式来减轻数据库I/O压力及系统资源的占用。增量备份主要是以全备或增量备份为基础,备份那些变更过的页面。其备份的原理是基于一个不断增长的LSN序列,这个LSN与Oracle的SCN类似。在恢复期间,我…...
房地产最新消息利好/中国seo
问题描述process p null;p runtime.getruntime().exec(“/system/xbin/su”)P.getOutPutStream();请问,这几行代码是什么意思啊 解决方案1/system/xbin/su 执行su这个命令,然后得到输出流。 可能是想root一下。 转载于:https:/…...
python基础教程第二版/aso优化什么意思是
java基础之main方法解读: 一、深入理解main方法:(由java虚拟机调用) 解释main方法的形式:public static void main (String [] args){} 1.java虚拟机需要调用类的main()方法,所以该…...
wordpress ios shared/河北软文搜索引擎推广公司
数着星星 盼着月亮2021国考笔试成绩终于出了! 成绩今日公布中公锦鲤给大家带来好运哭惹!也太快了吧!只能骂骂咧咧地打开查询入口▽▽▽扫码进入成绩查询入口国考成绩对手成绩&同岗分差万人报名产生千人大岗的XXX局究竟会有多少大神产生…...