# 包管理工具 npm/pnpm/yarn
默认情况下,Node.js 安装时会自带 NPM(Node Package Manager),作为最初的包管理工具,它为我们的开发提供了极大的便利。然而,随着项目的不断演进和需求的日益增长,仅仅依赖 NPM 可能无法完全满足我们的所有需求。
# NPM:JavaScript 开发者的首选包管理器
NPM(Node Package Manager),作为默认的 JavaScript 应用包管理器,与 Node.js 一同安装,它是目前使用最广泛的包管理器,得益于其对大量包的强大支持。
- NPM 的工作原理
NPM 拥有一个集中式的注册中心,其中托管了数以千计的包。这些包可以是库、框架、助手、工具或实用工具。当你运行 npm install 时,NPM 会从 NPM 注册中心下载 package.json 文件中列出的包。
下载这些依赖项时,NPM 还会生成一个锁文件(package-lock.json),该文件指定了为项目下载的所有依赖项(直接和间接)的确切版本。它充当了一个确定性记录,确保未来的安装,即使是在不同的机器上,也会尝试下载相同的版本。当没有锁文件或锁文件被删除时,NPM 将尝试下载满足 package.json 文件中指定的版本范围的最新兼容版本。
NPM 使用嵌套依赖树,确保每个包获得其依赖的确切版本。
- NPM 的优势与劣势
优势:
(1)广泛的支持 — NPM 托管着世界上最大的 JavaScript 包注册中心。
(2)简化的依赖管理 — NPM 以最简化的方式自动化查找、安装和管理依赖的过程。
(3)易于使用 — NPM 设置和使用简单,对所有技能级别的开发者都易于接入。
劣势:
(1)磁盘空间 — 由于 NPM 使用嵌套依赖树方法保存包,如果不同的依赖需要它们,它需要更多的磁盘空间来保存同一包的多个副本。
(2)依赖膨胀 — 如果依赖 / 包在长期内没有得到适当管理,可能会导致不必要地积累大量包,这可能会增加项目的大小并潜在引入兼容性问题。
(3)性能 — 与其他包管理器相比,特别是对于有许多依赖的较大项目,NPM 的安装可能会更慢,因为它顺序下载包。
# Yarn:超越 NPM 的现代 JavaScript 包管理器
由 Facebook 开发的一个 Node 包管理器,旨在解决当时 NPM 面临的一些问题。最初,NPM 缺乏对依赖版本精确控制和锁文件概念的支持,这正是 Yarn 诞生的原因。
- Yarn 的工作原理
(1)使用 yarn init 命令初始化一个项目,这会在项目中生成一个 package.json 文件。
(2)通过命令 yarn add <package_name> 添加任何包。
(3)如果你有一个预配置的项目,并且想要安装依赖,可以运行 yarn install 命令,这将从 NPM 注册中心下载所有依赖并生成一个锁文件。
- Yarn 的优点
(1)更快的安装速度:与 NPM 相比,Yarn 在安装包时可以并行执行,从而加快了安装速度。
(2)离线支持:Yarn 利用本地缓存加速安装过程。它在全局位置存储包的缓存,可以在不同项目之间共享,这样不仅提高了速度,还实现了 NPM 所没有的离线支持功能。使用 yarn cache dir 命令可以查看 Yarn 保存其包缓存的目录。
(3)更少的磁盘使用:Yarn 采用平级依赖结构,避免了包的重复和嵌套,从而最小化了磁盘使用。
(4)Monorepo 支持:Yarn 还旨在通过称为 WORKSPACE 的特性支持 monorepo。Monorepo 是一个单一的仓库,其中存在多个包,每个包都有自己的 package.json。Yarn Workspaces 通过从中心位置安装所有包的依赖来简化依赖管理。
# PNPM:高效节省磁盘空间的包管理器
PNPM,意为高性能的 NPM,它旨在解决 YARN 和 NPM 出现的问题。PNPM 通过引入一些与 NPM 和 YARN 相似却又具有明显改进的命令,为 JavaScript 项目的依赖管理带来了新的解决方案。
PNPM 的工作方式
- pnpm init:初始化一个新项目,类似于 npm init 或 yarn init。
- pnpm install <package_name>:安装包及其依赖。
- pnpm list:列出项目中安装的包。
- pnpm remove <package_name>:移除一个包。
- pnpm run <script_name>:运行 package.json 文件中定义的脚本。
PNPM 的优点
(1)磁盘效率:PNPM 使用全局存储方法,所有包在一个地方全局存储,不像 NPM 或 Yarn 那样。安装包时,PNPM 会从全局存储中链接文件到项目的 node_modules,因此我们不需要在每个应用中重复存储包,这使得它在磁盘使用上非常高效。
(2)锁文件:尽管 PNPM 使用非平面的内部结构,但它通过一个称为锁文件(通常命名为 pnpm-lock.yaml)的文件提供了依赖项的 “扁平化视图”。
(3)更快更轻:与 NPM 或 YARN 相比,PNPM 更快、更轻,因为它利用缓存,并不是每次都安装包。如果包在全局中找到,它将在该项目 / 应用的 node_module 中附加符号链接 / 硬链接。