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 <[email protected]> 安装指定版本 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依赖的[email protected][email protected][email protected]包会被平铺在根目录node_modules下*

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

  • 对没有手动引入(package.json配置)的包,可以直接引用: 例如[email protected]依赖的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 是通过共享依赖和使用符号链接来管理依赖项。这使得每个包都可以拥有自己的独立的文件夹,同时又能够共享相同的依赖项,在安装时,包里的文件会硬链接到这一位置,从而节省存储空间和提高性能

参考资料

相关推荐
唐人街都是苦瓜脸2 天前
pnpm install 和 npm install 的区别
前端·npm·node.js
qiandeqiande2 天前
Yarn与NPM缓存存储目录迁移
npm·yarn
A-wliang2 天前
深入解析 GitHub Token 与 NPM Token:自动化发布的完整指南
npm·自动化·github
放天狼3 天前
解决npm install 一直卡着不动,npm install --verbose
前端·npm·node.js
玉林路扛把子3 天前
基于当前项目通过npm包形式暴露公共组件
前端·npm·node.js
emo了小猫3 天前
VScode使用npm启动项目以及npm install ,npm start报错问题处理
ide·vscode·npm
程序猿小D3 天前
第24节 Node.js 连接 MongoDB
数据库·mongodb·npm·node.js·编辑器·vim·express
枫叶kx4 天前
发布一个angular的npm包(包含多个模块)
前端·npm·angular.js
田本初4 天前
npm符号链接
前端·npm·node.js
没事儿4 天前
升级老项目的包依赖
前端·npm·yarn