npm、cnpm、yarn、pnpm包管理器

445 阅读3分钟

引言

在前端开发中,包管理工具是必不可少的工具之一。目前,市面上有多种包管理工具可供选择,如 npmcnpmyarn 和 pnpm 等。下面我们将详细讲解这四种包管理器,分析其不同之处以及简单讲解下npx和nvm。

npm(Node Package Manager)

  • npm 是 Node.js官方的包管理器,也是JavaScript生态系统中最受欢迎的包管理器之一

  • npm可以自动解析项目中的依赖项,并安装所需安装包

  • npm使用package-lock.json文件来确保安装过程中使用相同的依赖项版本

  • npm是单线程解析依赖项,因此安装速度可能相对较慢

  • npm使用package-lock.json文件锁定依赖版本,这可能导致包版本冲突和依赖冲突的困扰

cnpm(China NPM)

  • cnpm是阿里巴巴推出的包管理工具,是中国版的npm

  • cnpm安装之后默认使用registry.npmmirror.com这个淘宝镜像源

  • cnpm与npm基本相同,只是在国内,下载速度更快

yarn(Yet Another Resource Negotiator)

  • yarn是Facebook开发的包管理器,是为了弥补npm的缺陷出现的

  • yarn可以并行下载和缓存软件包,yarn是同步执行所有任务,其安装速度比npm较快

  • yarn支持离线模式,使用本地缓存,可以在无互联网连接就能安装本地缓存的依赖项

  • yarn还引入了yarn.lock锁定文件,用来确保团队成员在使用相同的包版本

  • yarn将所有软件包都缓存在本地,可能会占用大量的磁盘空间

pnpm(Performant NPM)

  • pnpm是Node.js的替代包管理器,有着快速且节省空间的特点

  • pnpm所有的依赖会被存储在内容可寻址的存储中,即存储在硬盘的同一位置,当我们需要安装的依赖在硬盘中已经存在,包里的文件会硬链接到这一位置而不是重新安装,这样多个项目可以共享同一依赖,也是因为pnpm将依赖项链接到一个共享的存储库开减少重复的下载,使得pnpm可以更快地安装 和更新模块

  • pnpm还允许在不同的项目之间共享相同的依赖项,从而节省磁盘空间

  • pnpm与yarn类似,也可以使用多线程解析依赖项,同样也支持离线模式

  • pnpm采用了不同的依赖性解析方法,可能存在一些兼容性问题

安装

包管理器安装方式
npm新版的Node.js已经集成了npm,安装Node.js的时候,npm也一并安装好了,Node.js下载传送门
cnpmnpm install -g cnpm
pnpmnpm install -g pnpm
yarnnpm install -g yarn

命令对比

命令npmcnpmpnpmyarn
安装依赖项npm install <package-name>cnpm install <package-name>pnpm install <package-name>yarn add <package-name>
全局安装npm install -g <package-name>cnpm install -g <package-name>pnpm install -g <package-name>不支持全局安装,yarn的bin目录路径不会添加到环境变量
更新依赖项npm updatecnpm updatepnpm updateyarn upgrade
删除依赖项npm uninstall <package-name>cnpm uninstall <package-name>pnpm uninstall <package-name>yarn remove <package-name>
运行脚本npm run <script-name>cnpm run <script-name>pnpm run <script-name>yarn run <script-name>

扩展:npx nvm

npx

  • npx是一个工具,是npm v5.2.0引入的一条命令(npx),旨在方便调用项目内部安装的模块
  • 优点:临时安装可执行依赖包,不用全局安装,不用担心长期的污染
  • 缺点:主动下载的文件,用完就会删除。下次还要再次下载,耗时耗资源
  • 安装:npm install -g npx

nvm

  • nvm是个版本管理工具,一个 nvm 可以管理很多 node 版本和 npm 版本,nvm可以让你在不同的nodejs版本之间来回切换
  • Node.js 的版本迭代速度太快,一套系统中可能会部署不同的 Node.js 版本,各个版本之间没有办法直接兼容,需要开发人员不同的切换版本,nvm 就为了满足这个需求而存在的