npm yarn pnpm

232 阅读4分钟

yarnnpmpnpm 都是构建和打包 javascript 代码的工具(包管理工具)。

npm

  1. 不用单独安装,它随 node 一起提供,node装好了npm就自动装好了【node是一个JS运行环境】
  2. npm是一个包,这个包可以管理(下载、更新、删除)别的包
  3. npm在下载包的时候有一个缓存的过程,我们一般不会使用npm默认下载缓存目录,而会自定义指定npm下载缓存目录 执行 npm config set cache "C:\Program Files\nodejs\npm_cache"
  4. npm下载包分为本地下载和全局下载,本地下载会下载到指定的文件夹,而全局下载会下载到默认的全局包保存路径,我们一般不会使用npm默认的全局包下载保存路径,而会自定义指定npm全局包下载路径。 执行 npm config set prefix "C:\Program Files\nodejs\npm_global"

注意:npm自定义修改了全局包存放路径,还需要去设置环境变量,将自定义全局包路径加到环境变量中,否则全局装的包没法在命令行窗口中正常使用

yarn:

Yarn是由Facebook、Google、Exponent 和 Tilde 联合推出了一个新的 JS 包管理工具(取代npm) ,是为了弥补 npm 的一些缺陷而出现。

  1. 这个包默认没有,需要使用npm来进行安装   执行命令:npm install -g yarn
  2. yarn在下载包的时候有一个缓存的过程,我们一般不会使用yarn默认下载缓存目录,而会自定义指定yarn下载缓存目录
    执行 yarn config set cache-folder "C:\Program Files\nodejs\yarn_cache"
  3. yarn下载包分为本地下载和全局下载,本地下载会下载到指定的文件夹,而全局下载会下载到默认的全局包保存路径,我们一般不会使用yarn默认的全局包下载保存路径,而会自定义指定yarn全局包下载路径。 执行 yarn config set global-folder "C:\Program Files\nodejs\yarn_global" 注意:yarn自定义修改了全局包存放路径,还需要去设置环境变量,将自定义全局包路径加到环境变量中,否则全局装的包没法在命令行窗口中正常使用

Npm的劣势**

npm install太慢。特别是新的项目拉下来要等半天,删除node_modules,重新install的时候依旧如此。 同一个项目,安装的时候模块版本无法保持一致性。这是由于package.json文件中版本号的缘故。同一个项目,安装的时候无法保持一致性。由于package.json文件中版本号的特点,下面三个版本号在安装的时候代表不同的含义。 “5.0.3”表示安装指定的5.0.3版本,“~5.0.3”表示安装5.0.X中最新的版本,“^5.0.3”表示安装5.X.X中最新的版本。这就麻烦了,常常会出现同一个项目,有的同事是OK的,有的同事会由于安装的版本不一致出现bug。

安装报错被覆盖。安装的时候,包会在同一时间下载和安装,中途某个时候,一个包抛出了一个错误,但是npm会继续下载和安装包。

Yarn的优势

安装速度快 (服务器速度快 , 并且是并行下载) 版本锁定,安装版本统一 离线缓存机制,如果之前已经安装过一个软件包,用Yarn再次安装时从缓存中获取,就不用像npm那样再从网络下载了

离线缓存,yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快。 安装版本一致:在执行代码之前,Yarn 会通过算法校验每个安装包的完整性。并且为了防止拉取到不同的版本,Yarn 有一个锁定文件 (lock file) 记录了被确切安装上的模块的版本号。 简洁语义:yarn改变了一些npm命令的名称,比如 yarn add/remove,感觉上比 npm 原本的 install/uninstall 要更清晰。

pnpm

npm1、npm2采用递归管理,npm3、npm3+、yarn依赖扁平化管理消除依赖提升。

pnpm依赖策略:消除依赖提升、规范拓扑结构

支持monorepo

他比npm和yarn速度快两倍 它是通过硬链接和软连接来特定的存储地址

pnpm的所有依赖包都会放在统一的位置

1.如果对同一依赖包使用相同版本的依赖,那么磁盘上只存储这一份

2.如果对同一依赖使用不同的版本的依赖,那么版本之间相同的文件只存储一份,不同的文件会被存储多份

pnpm安装依赖包时,包含的文件会硬连接到统一的存储位置 可以让不同项目之间分享依赖包

pnpm store prune 可以清理pnpm-store依赖