详解包管理工具npm、yarn、pnpm、cnpm的不同

包管理工具

最初的包管理工具是npm,其余的包管理工具是通过npm进行发展的,npm(Node Package Manager),也就是node包管理器,是用于管理项目中所依赖的第三方包。

npm

npm包管理工具是为了我们项目进行依赖管理的工具,在npm出现之前,项目依赖都是手动下载和管理引入的。在npm出现之后,可以通过npm install xxx的方式将第三方依赖的信息(包括名称和版本号)存储在package.json的dependencies字段中,并且将下载的文件保存到node_modules文件夹中。

package.json文件中的字段

package.json文件中会包括项目的名称(name)、项目版本号(version)、项目描述(description)、项目执行入口(main)等字段,也会在dependencies字段中记录着项目所依赖的第三方库的名称以及版本号,这个文件可以通过npm init 手动配置,也可以通过npm init -y快速实现默认配置。

dependencies依赖类型

dependencies

通过npm install xxx安装,表示这个依赖实在项目运行时的依赖,比如axios,在项目运行的时候需要使用的依赖。

devDependencies

通过npm install -D或者npm install --save-dev安装,表示该依赖实在开发时的依赖,打包build时,不会打进包里,是用来辅助我们开发的,比如项目中使用的 gulp ,压缩 css、js 的模块。这些模块在我们的项目部署后是不需要的。

peerDependencies

这个属性比较特殊,只会在发布自己的包时才会用到,或者说某个包是在为另一个包开发插件时才会用到,或者说有些模块必须需要其他模块作为前提才能使用,这个时候在那个模块的packag.json文件里面的peerDependencies会有标注。比如element-plus使用的前提就是需要有vue。

npm install的执行原理

当我们npm install xxx时,会在package-lock.json中创建依赖,并记录当前项目所用依赖的版本号,当我们删除node_modules文件夹时而保存package.json和package-lock.json文件时,执行npm install时会有下列两种不同情况。

  • 当package.json和package-lock.json中的版本号不一致时执行npm install下载包时,会下载package.json中的包的版本,并且更新package-lock.json中的包的版本与package.json中相同例如:

  • 如果两者是同一状态,那么执行npm i都会根据lock下载,不会理会package实际包的版本是否有新。

附一张看到的关于npm install的原理图

npm常用命令

npm list -g --depth 0        查看全局安装过的模块
npm init                     生成 package.json 文件(需要手动选择配置)
npm init -y                  生成 package.json 文件(使用默认配置)
npm i/install                一键安装 package.json 下的依赖包
npm i xxx                    在项目中安装包名为 xxx 的依赖包(配置在 dependencies 下)
npm i xxx --save             在项目中安装包名为 xxx 的依赖包(配置在 dependencies 下)
npm install xxx@latest       更新包的版本至最新
npm i xxx --save-dev         在项目中安装包名为 xxx 的依赖包(配置在 devDependencies 下)
npm i -g xxx                 全局安装包名为 xxx 的依2赖包
npm update -g xxx            更新全局安装的包
npm uninstall -g xxx         卸载全局安装的包
npm run xxx                  运行 package.json 中 scripts 下的命令
npm home xxx                 打开 xxx 包的主页
npm repo xxx                 打开 xxx 包的代码仓库
npm publish                  将当前模块发布到 npmjs.com,需要先登录

yarn

yarn也是一个包管理器,它和npm其实没有本质区别,都是管理和安装包的。只是它解决了早期npm的一些问题比如:不支持离线模式、树形结构的依赖、依赖安装不确定性等。为什么说是早期?因为npm新版本基本上已经解决了自身的老毛病,两者没有想象中那么大的区别。

早期的yarn相对于npm比较大的优势:

支持离线安装(npm@5已支持)
依赖扁平化结构(npm@3已支持)
依赖安装确定性yarn.lock(npm@5增加了package-lock.json)
安装速度快并行下载
安装失败自动重试

关于yarn的并行下载

在npm中,是按照队列中的顺序去下载每一个依赖的,也就是当前依赖没有下载完毕是不会去下载其他依赖的,而yarn下载依赖的方式是并行的,会同步执行所有依赖的下载。

yarn常用命令

yarn set version latest    将yarn更新至最新版本
yarn init                  初始化项目,生成 package.json 文件(需要手动选择配置)
yarn init -y               生成package.json文件(使用默认配置)
yarn/yarn install          安装所有依赖项
yarn serve                 默认运行vue项目文件同于npm run serve
yarn build                 默认打包vue项目同于npm run build

//添加依赖包
# 在项目中安装包名为 xxx 的依赖包(配置在 dependencies 运行时依赖 下),同时 yarn.lock 也会被更新
yarn add [package]        
yarn add [package]@[version]
yarn add [package]@[tag]
# 全局安装包名为 xxx 的依赖
yarn global add xxx

//将依赖项添加到不同的依赖类别中
yarn add [package] --dev  # dev dependencies
yarn add [package] --peer # peer dependencies

//更新依赖包
yarn up/upgrade [package]    (默认更新至最新版本)
yarn up/upgrade [package]@[version]
yarn up [package]@[tag]

//删除依赖包
yarn remove [package]

cnpm

cnpm与npm的不同两者之间只是node中包管理器的不同。 npm是node官方的包管理器。cnpm是个中国版的npm,是淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm。如果因为网络原因无法使用npm下载,那cnpm这个就派上用场了。

npm和cnpm只是下载的地址不同,npm是从国外下载东西,cnpm是从国内下载东西。

由于国内下载国外的包,下载的网速可能会很慢甚至失败,所以此时就可以通过国内镜像,可以通过下列方式查看当前镜像并修改镜像。

# 查看npm镜像:
npm config get registry


# 我们可以直接设置npm的镜像:
npm config set registry https://registry.npm.taobao.org

如果不想直接修改npm的下载路径(国外下载路径更改为国内淘宝镜像),我们可以下载cnpm,并将cnpm的镜像设置为淘宝镜像。

npm install -g cnpm --registry=https://registry.npm.taobao.org

 pnpm

pnpm 项目的初始状态看起来就像一个 npm 项目一样,也是有 package.json 文件 和 node_modules 文件夹,不同的是在 node_modules 文件夹中, 它有自己的文件夹目录 .pnpm,在这个目录中,它会用平铺的方式来存储各个包,然后以依赖名和版本号的名字命名,实现了版本的复用。而且它不是通过拷贝机器缓存中的依赖到项目目录下,而是通过硬链接的方式,这能减少空间占用。

pnpm到底做了什么

  • 当使用 npm 或 Yarn 时,如果你有 100 个项目,并且所有项目都有一个相同的依赖包,那么, 你在硬盘上就需要保存 100 份该相同依赖包的副本。
  • 如果是使用 pnpm,依赖包将被存放在一个统一的位置,因此:
  • 如果你对同一依赖包使用相同的版本,那么磁盘上只有这个依赖包的一份文件;
  • 如果你对同一依赖包需要使用不同的版本,则仅有版本之间不同的文件会被存储起来;
  • 所有文件都保存在硬盘上的统一的位置:
  • 当安装软件包时,其包含的所有文件都会硬链接到此位置,而不会占用额外的硬盘空间;
  • 这让你可以在项目之间方便地共享相同版本的依赖包;

总结

  1. npm是一个包管理器,方便开发者分享和下载开源包。经历了许多重大版本的更新,各方面已经和yarn在同一水平。
  2. cnpm是方便中国开发者下载依赖包而诞生的下载器。
  3. yarn解决了npm@5之前的一些让人诟病的问题,同时拥有一些其它的优点。例如离线安装、失败自动重试安装和并行下载等。
  4. pnpm通过连接的方式,让多个项目的依赖公用同一个包,大大节省了磁盘空间,比yarnnpm下载速度快得多,但是也有连接带来的各种兼容问题。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值