cnpm|npm|yarn|pnpm 切换源(nrm、yrm)、说明以及区别

本文默认电脑已经安装node.js

因为npmpnpmyarn的默认源是在国外,我们访问时会比较慢,一般都会使用淘宝的镜像,或者有些有公司自己的镜像,这就涉及到切换源的操作,总结一下这些操作

cnpm

cnpm是一个开源的Node.js包管理工具,它是npm(Node Package Manager的一个国内镜像,通过使用cnpm可以在中国境内更快地安装和管理 Node.js 模块

安装

sh 复制代码
npm install -g cnpm --registry=https://registry.npm.taobao.org
  • 该命令中的--registry=https://registry.npm.taobao.org参数是为了指定使用淘宝源作为安装源

使用

sh 复制代码
# 支持 `npm` 除了 `publish` 之外的所有命令
cnpm install [module_name]

cnpm是一个可选的工具,主要针对在中国境内安装和管理Node.js模块时的速度问题。在其他地区或国外,直接使用默认的npm工具也是完全可行

npm

npm(Node Package Manager)是 Node.js 的官方包管理工具。它允许您在项目中快速安装、管理和更新依赖模块

sh 复制代码
# 查看源
npm get registry
npm config get registry
# 临时修改
npm config set registry <registry-url>
# 永久修改
npm config set registry <registry-url> -g
# 还原
npm config set registry https://registry.npmjs.org
p=npm config delete registry
# 更新依赖项
npm update
# 安装依赖项
npm install
# 卸载依赖项
npm uninstall
# 删除依赖项
npm remove
# 运行脚本
npm run
#  清除缓存
npm cache clean

pnpm

pnpm 是一种包管理工具,与 npm 和 Yarn 类似,它可以帮助您在项目中管理依赖项

  • **空间效率:**pnpm 使用一种称为"链接"(linking)的机制,将相同的包共享在磁盘上,从而节省磁盘空间。这意味着即使项目中使用了许多相同的依赖项,它们也只会在磁盘上占用一次空间。
  • **安装速度:**由于链接机制,pnpm 的安装速度比 npm 和 Yarn 更快。它只需下载每个包一次,然后链接到不同的项目中,无需重复下载
  • **并行安装:**pnpm 可以并行安装依赖项,这进一步加快了安装速度
  • **更少的内存占用:**pnpm 使用较少的内存,因为它只在需要时加载依赖项。这对于资源受限的环境非常有用
  • **容易迁移:**pnpm 可以与 npm 兼容,您可以将现有的 package.json 和 node_modules 目录与 pnpm 一起使用,无需进行修改
sh 复制代码
# 安装
npm install -g pnpm
# 查看源
pnpm get registry
pnpm config get registry
# 临时修改
pnpm config set registry <registry-url>
# 永久修改
pnpm config set registry <registry-url> -g
# 还原
pnpm config set registry https://registry.npmjs.org
pnpm config delete registry
# 更新依赖项
pnpm update
# 安装依赖项
pnpm install
# 卸载依赖项
pnpm uninstall
# 删除依赖项
pnpm remove
# 运行脚本
pnpm run
#  清除缓存
pnpm store prune
命令 说明
pnpm install <module_name> 保存到 dependencies
pnpm install <module_name> -S 保存到 dependencies
pnpm install <module_name> -D 保存到 devDependencies
pnpm install <module_name> -O 保存到 optionalDependencies
pnpm add <module_name@3.0.0> 安装指定版本 3.0.0

optionalDependencies 是一个可选的字段,用于指定项目的可选依赖项。它位于与dependenciesdevDependencies字段相同的层级。optionalDependencies字段是一个供包管理工具参考的字段,它不会影响项目的实际运行。这意味着即使可选依赖项未成功安装,您的项目仍应该能够正常运行,只是缺少对可选依赖项的使用支持或某些功能

nrm

nrm是一个用于管理和切换npmpnpm源的工具。它可以让您快速切换源,以便在不同的源之间进行选择,以提高下载包的速度

sh 复制代码
# 安装
npm install -g nrm 
# 查看所有的可用的源
nrm ls
# 添加源
nrm add <registry_name> <registry_url> #  如:nrm add cnpm http://r.cnpmjs.org/
# 删除源
nrm del <registry_name> # 如:nrm del cnpm
# 切换源
nrm use <registry_name> # 如 nrm use cnpm
# 测试源的速度
nrm test

需要注意的是当使用npm publish命令时,必须先将源切换至npm(nrm use npm),否则发布不成功

yarn

Yarn是一个由Facebook和其他开发者合作开发的包管理工具,用于管理项目的依赖关系。它旨在提供更快、更安全和更可靠的依赖安装和管理体验

sh 复制代码
# 查看源
yarn config get registry
# 临时修改
yarn config set registry <registry_url>
# 永久修改
yarn config set registry <registry_url> -g
# 还原
  yarn config set registry https://registry.yarnpkg.com 
  #或者 
  yarn config delete registry
# 添加一个依赖
yarn add <packageName>
# 更新一个依赖
yarn upgrade <packageName>
# 移除一个依赖
yarn remove <packageName>
#  清除缓存
yarn cache clean

yrm

yrm是一个用于管理和切换Yarn源的工具,可以帮助您选择合适的源,以提高包的下载速度

sh 复制代码
# 安装
npm install -g yrm
# 查看所有的可用的源
yrm ls
# 添加源
yrm add <registry_name> <registry_url> 地址 #  如:yrm add cnpm http://r.cnpmjs.org/
# 删除源
yrm delete <registry_name> # 如:yrm del edunpm
# 切换源
yrm use <registry_name> # 如 yrm use cnpm
# 测试源的速度
yrm test

异同(优缺点)

npmpnpmYarn是三种常用的Node.js包管理工具,它们之间有一些区别,包括性能、安装方式和依赖管理等方面。

  • 1、性能
    • npm:在过去,npm 在执行依赖安装时可能会存在较慢的问题,特别是当项目中存在大量依赖关系时。然而,从npm 5.x版本开始,它改进了性能,引入了锁文件(package-lock.json)来确保可重复性安装,并提供了更快的安装速度。
    • Yarn:Yarn 是由Facebook开发的包管理工具,旨在解决npm的性能问题。它引入了锁文件(yarn.lock)来确保可重复性安装,并通过并行下载和缓存来提高安装速度。Yarn 在性能方面与 pnpm 相似,但在一些特定场景下可能会更快一些。
    • pnpm:pnpm是一个新兴的包管理工具,旨在提供更快的安装速度和较低的磁盘空间使用。pnpm通过共享依赖,只在单个文件夹中保存一份依赖的副本,并使用符号链接来引用它们,从而减少了磁盘空间的使用。这也导致了更快的安装速度和更少的网络传输。
  • 2、安装方式
    • npmYarn 都是通过命令行工具进行安装的。您需要在全局或项目的根目录中运行相应的命令来管理依赖项。
    • pnpm 通过在全局安装后,在项目根目录中直接运行pnpm命令。pnpm不需要在每个项目中都保存一份依赖的副本,因此可以极大地减少磁盘空间的使用。
  • 3、依赖管理
    • npmpnpmYarn 都支持package.json文件来管理项目的依赖关系和元数据。您可以在文件中指定所需的包及其版本范围。
    • 在安装依赖时,npm 使用package-lock.json(或 npm-shrinkwrap.json)来确保安装的依赖是可重复的。
    • Yarn 使用yarn.lock文件来确保可重复性安装。它还支持自动的版本解析和并行安装。
    • pnpm 使用共享依赖的方式来减少磁盘空间的使用,并使用了快速、精确的算法来解析依赖关系。

npm yarn pnpm 依赖管理深剖

首先,我们在开始之前先简单列举一下不同node版本对应的npm版本

node版本 npm版本
Node.js 0.12.x npm 2.15.x
Node.js 4.x npm 2.15.x
Node.js 5.x npm 3.x
Node.js 6.x npm 3.x 或 4.x
Node.js 8.x npm 5.x 或 6.x
Node.js 10.x npm 6.x 或 7.x
Node.js 12.x npm 6.x 或 7.x
Node.js 14.x npm 6.x 或 7.x
Node.js 16.x npm 7.x 或更新的版本

npm2 依赖管理

npm2生成的依赖管理比较的简单直接,会按照安装包的依赖树形结构直接下载在本地的目录结构下

上面的目录在node_modules下有两个依赖expresskoa,而expresskoa都同时依赖accepts,而它们会分别将所需依赖accepts安装在各自的目录下

npm2的这种方式的优点就是比较的直观,但是缺点也是显而易见的:

  • 层级依赖过深
  • 相同包的相同版本会多次被下载,利用率低,占用磁盘空间大

npm3+/yarn依赖管理

为了解决npm2的缺点,npm3以后的版本使用了类似于yarn的包管理方式,不在使用嵌套结构,而是将相同的依赖包平铺,这样就能解决层级依赖过深和包的利用率的问题,我们就会看到下面的依赖关系图

我们将上面的依赖关系使用关系图简单说明一下

上面的目录在node_modules下有两个依赖expresskoa,而expresskoa都同时依赖相同小版本的accepts,而此时accepts包就会被平铺于根目录node_modules

我们上面详细说明了npm3+以及yarn在不同依赖拥有相同小版本的依赖时的情况,那么如果不同依赖引用不同版本的依赖时又是什么情况呢?我们下面来深剖一下

我们将上面的依赖关系使用关系图简单说明一下

上面的目录在node_modules下有两个依赖expresskoa,而expresskoa都同时依赖不同版本的debughttp-errorsstatuses

** express依赖的debug@2.6.9http-errors@2.0.0statuses@2.0.1包会被平铺在根目录node_modules下*

  • koa依赖的debug@4.3.2http-errors@1.6.3statuses@1.5.0包会被安装在自己目录下的node_modules文件夹中 至于为什么说express的依赖包会在根目录的node_modules下呢,这是npm自己的一个规则

总体来说,npm从3+yarn采用了扁平化的方式来安装node_modules。在安装时,会遍历整个依赖树,不管是项目的直接依赖还是子依赖的依赖,都会优先安装在根目录的node_modules中。遇到相同名称的包,如果发现根目录的node_modules中存在但是不符合语义化版本(semver-range),会在子依赖的node_modules中安装符合条件的包。 npm从3+yarn的这种平铺方式确实是解决了层级依赖深和包的利用率的问题,但是也引入了其他的问题:

  • 对没有手动引入(package.json配置)的包,可以直接引用: 例如express@4.18.1依赖的cookie,而此时cookie会被安装到根目录的node_modules中,而我们项目中恰巧需要cookie,我们就直接可以引用,无需在package.json中配置依赖cookie,这样就造成了如果哪天express改变了策略不在使用cookie,而我们的项目中又使用了cookie,这样就会导致项目无法启动
  • 依赖的冗余:虽然npm是共享了相同版本的依赖,但是如果版本不同,npm还是会完整的下载两个不同的版本,这样也会有依赖的冗余

pnpm依赖管理

pnpm为了解决npm3yarn带来的一些问题呢,采用了另外一种方式来管理依赖:所有依赖模块是共享的,每个项目都使用一个独立的虚拟环境。这意味着每个依赖都有一个独立的文件夹,其中包含项目所需的所有依赖(硬链接和符号链接),并且每个依赖项只会在磁盘上存储一次

  • 当一个包被多个包所依赖时,pnpm会将这个包的实际文件只下载一次,并在各个包的文件夹中创建相应的链接指向这个实际的文件。这样,不同包之间可以共享相同版本的依赖项,节省磁盘空间并提高安装速度
  • 当某个包的依赖存在冲突版本时,pnpm会根据每个包的实际需要来解决这个冲突。pnpm会下载不同版本中不同的有差异的文件添加到仓库(store),其中包含适用于该包的特定版本的依赖项。这样,即使不同包的依赖存在冲突,它们也不会相互干扰

node_modules中的依赖只有在package.json中手动引入的依赖expresskoa,细心的你会发现这两个文件后面有一个箭头,而这个箭头就是pnpm使用的软连接的方式指向了.pnpm文件夹真正的文件

总体来说,pnpm 是通过共享依赖和使用符号链接来管理依赖项。这使得每个包都可以拥有自己的独立的文件夹,同时又能够共享相同的依赖项,在安装时,包里的文件会硬链接到这一位置,从而节省存储空间和提高性能

参考资料

相关推荐
NiNg_1_2343 小时前
npm、yarn、pnpm之间的区别
前端·npm·node.js
奔跑吧邓邓子7 小时前
npm包管理深度探索:从基础到进阶全面教程!
前端·npm·node.js
朗朗乾坤.py1 天前
Hadoop HDFS命令操作实例
hadoop·hdfs·npm
哇咔咔哇咔1 天前
【科普】什么是npm和pip?它们之间有什么异同?
前端·npm·pip
太阳火神的美丽人生1 天前
Vant WeApp 开启 NPM 遇到的问题总结
前端·npm·node.js
Minyy113 天前
小程序-使用npm包
前端·小程序·npm·node.js
Mrs_Lupin3 天前
npm与包
前端·npm·node.js
潜心专研的小张同学3 天前
pnpm依赖安装失败解决|pnpm项目从一个文件夹复制到另一个文件夹运行失败问题解决-以vbenAdmin项目为例
前端·javascript·vscode·npm·vue·pnpm
西西o4 天前
Linux服务安装node,npm与yarn
linux·运维·npm
世俗ˊ4 天前
npm、yarn、pnpm对比
前端·npm·node.js