npm 与 yarn 与 pnpm

263 阅读6分钟

npm

NPM全称Node Package Manager,是Node.js包管理工具,是全球最大的模块生态系统,里面所有的模块都是开源免费的;也是Vue/Node.js的包管理工具,相当于Java中的Maven、Python中的PIP。

npm是Node.js官方推出的包管理工具,它是JavaScript世界中最流行的包管理工具之一。通过npm,我们可以方便地安装、更新和删除项目的依赖包。npm默认使用的是官方的npm镜像源,但由于国内网络环境的限制,使用npm安装依赖包可能会比较慢。可以通过换源加快速度

优点
  1. 社区支持:npm 是 Node.js 的默认包管理器,拥有庞大的社区支持和丰富的可用包。开发者可以轻松地找到所需的库和工具。
  2. 兼容性:npm 与 Node.js 版本紧密相关,因此在兼容性方面表现良好。
  3. 易于使用:npm 的命令简单易懂,对于初学者来说非常友好。

缺点

  1. 嵌套依赖:npm 使用嵌套的依赖结构,可能导致大量的重复包安装,占用更多的磁盘空间。这种结构可能会导致“依赖地狱”,使得项目难以维护。
  2. 安装速度:npm 的安装速度相对较慢,尤其是在处理大型项目时。这可能会影响开发者的生产力。
  3. 不稳定的锁定文件:package-lock.json 文件会在执行 npm 命令时自动更新,可能导致依赖关系不稳定。

npx

npx 是什么 npx是一个由Node.js官方提供的用于快速执行npm包中的可执行文件的工具。它可以帮助我们在不全局安装某些包的情况下,直接运行该包提供的命令行工具。npx 在执行时,如果发现本地项目依赖项中不存在的包,则会自行安装远程 npm 库中的包至 npm 缓存当中,运行完成后会删除

使用npx时,可以在命令行中输入要执行的包名加上其参数,例如:

npx create-react-app my-app

以上命令会在本地下载并运行create-react-app包中的可执行文件,创建一个名为my-app的React应用程序。

npx 会把远端的包下载到本地吗?
npx 不会像 npm 或 yarn 一样将包下载到本地的 node_modules 目录中。相反,它会在执行命令时,在本地缓存中寻找并下载包,然后执行该包中的命令。这样可以避免在开发过程中在全局安装大量的包,同时也可以确保使用的是最新版本的包。

npx 执行完成之后, 下载的包是否会被删除?
是的,npx会在执行完命令后删除下载的包。这是因为npx会在执行命令之前,将需要执行的包下载到一个临时目录中,并在执行完毕后删除该目录。这样可以避免在本地留下不必要的依赖包。如果需要保留依赖包,可以使用--no-cleanup选项来禁止删除下载的包。

yarn

Yarn 由Facebook 开发
Yarn缓存了它下载的每个软件包,因此它永远不需要再下载它。它还并行化操作,以最大限度地提高资源利用率,因此安装时间比以往任何时候都快。
Yarn在执行代码之前使用校验和来验证每个已安装的软件包的完整性。 使用详细但简洁的锁文件格式和确定性安装算法
Yarn能够保证在一个系统上工作的安装在任何其他系统上的工作方式完全相同。

优点

  1. 扁平化依赖结构:yarn 使用扁平化的依赖结构,避免了重复包的安装,减少了磁盘空间占用。这有助于提高项目的可维护性。
  2. 安装速度:Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快,尤其是在处理大型项目时。这有助于提高开发者的生产力。
  3. 离线模式:yarn 提供了离线模式,可以在没有互联网连接的情况下安装之前已经缓存过的包。这在有限的网络环境下非常有用。
  4. 安全:在执行代码之前,Yarn 会通过算法校验每个安装包的完整性。
  5. 更好的用户体验:与 npm 相比,yarn 的命令行界面(CLI)提供了更好的用户体验,包括清晰的输出和进度条。

缺点

  1. 社区支持:虽然 yarn 的社区支持也很好,但相较于 npm,它的社区和可用包相对较少。
  2. 需要额外安装:yarn 不是 Node.js 的内置包管理器,需要单独安装。

可以通过 npm 安装 yarn:

npm install -g yarn

yarn 和 npm 命令对比

NPMYarn说明
npm inityarn init初始化某个项目
npm install/linkyarn install/link默认安装依赖
npm install taco --saveyarn add taco安装某个依赖并默认保存到package
npm uninstall taco --saveyarn remove taco移除某个依赖
npm install taco --save-devyarn add taco --dev安装某个开发时的依赖
npm update taco --saveyarn upgrade taco更新某个依赖项目
npm install taco --globalyarn global add taco安装某个全局依赖项目
npm publish/login/logoutyarn publish/login/logout发布/登录/退出
npm run/testyarn run/test运行某个命令

pnpm

PNPM是一个快速、轻量级、模块化、安全、节省磁盘空间、可靠的JavaScript包管理器,它与npm和yarn类似,但具有一些优势。它通过共享依赖项来减少磁盘空间和下载时间。它与npm兼容,并且可以在npm的基础上构建。
与npm不同的是,pnpm使用了一种称为“符号链接”的机制来共享依赖包。这意味着,当多个项目使用相同的依赖包时,它们实际上共享同一个依赖包的副本,而不是每个项目都拥有自己的副本。这样可以显著减少磁盘空间的占用,并且安装依赖包的速度也会更快。

优点

  1. 磁盘空间优化:pnpm 使用了一种称为“symlink”的技术,将所有依赖项存储在一个共享的位置,而不是为每个项目单独安装。这可以大大减少磁盘空间的占用。
  2. 安装速度:pnpm 的安装速度相对较快,尤其是在处理大型项目时。这有助于提高开发者的生产力。
  3. 严格的依赖管理:pnpm 严格遵循依赖关系,这有助于避免在项目中意外地引入未在 package.json 中声明的依赖项。这有助于提高项目的可维护性。

缺点

  1. 社区支持:pnpm 是一个相对较新的包管理器,其社区支持和可用包相对较少。
  2. 兼容性问题:由于 pnpm 使用 symlink 技术,可能会导致某些工具或库在处理依赖关系时出现兼容性问题。

cnpm

cnpm是淘宝团队开发的一个针对中国用户的npm镜像源,它是npm的一个定制版本。由于国外的npm源在国内访问速度较慢,所以cnpm镜像源可以提供更快的下载速度。cnpm的使用方式与npm基本相同,只需将npm替换为cnpm即可。