前端打包工具之npm、yarn、pnpm对比

1、npm

1.1 概述

NPM(Node Package Manager),作为默认的JavaScript应用包管理器,与Node.js一同安装,它是目前使用最广泛的包管理器,得益于其对大量包的强大支持。

1.2 安装

首先需要安装 Node.js,安装好之后,npm 会自动安装在电脑上,因此无需另行安装。你可以在命令行中输入 npm -v 命令,检查 npm 是否已经正确安装。如果输出了版本号,则说明 npm 安装成功。

# 查看 Node.js 版本信息
node -v
# 查看 npm 版本信息
npm -v

1.3 常用命令

# 1、创建一个新的 Node.js 应用程序或模块,并在 package.json 文件中定义依赖项。
npm init

# 2、安装依赖项。如果在安装时没有指定包的版本号,则将安装最新版本的包。
npm install

# 3、安装指定的依赖项,并将其添加到 package.json 文件中的 dependencies 中。
npm install <package name> --save

# 4、安装指定的开发依赖项,并将其添加到 package.json 文件中的 devDependencies 中。
npm install <package name> --save-dev

# 5、将包安装为全局包,以便在系统的任何位置使用它们。
npm install -g <package name>

# 6、更新 package.json 文件中指定的所有包的版本。
npm update

# 7、更新指定的包的版本。
npm update <package name>

# 8、卸载指定的依赖项,并将其从 package.json 文件中的 dependencies 或 devDependencies 中删除。
npm uninstall <package name>

# 9、查看指定的包的详细信息,包括其版本、描述、关键字、维护者等。
npm view <package name>

# 10、搜索与指定关键字匹配的包。
npm search <keywords>

# 11、清除 npm 的缓存。
npm cache clean

# 12、启动 Node.js 应用程序。
npm start

# 13、运行测试套件。
npm test

# 14、运行 package.json 文件中指定的脚本。
npm run <script name>

# 15、列出当前项目中已安装的所有包及其依赖关系。
npm ls

# 16、检查当前项目中已安装的包是否有过时的版本。
npm outdated:

# 17、查看指定包的详细信息。
npm view <package name>

# 18、查看指定包的摘要信息。
npm info <package name>

# 19、将当前目录下的代码发布为一个 npm 包。
npm publish

# 20、查看当前登录的 npm 用户名。
npm whoami

1.4 优缺点

优点

  • 广泛使用:作为Node.js的默认包管理器,npm拥有最庞大的用户基础和生态系统,几乎所有的Node.js模块都在npm注册中心发布。
  • 全面的包库:npm拥有数百万的软件包,涵盖了从前端框架到后端工具的广泛领域,几乎可以找到任何需要的库或工具。
  • 灵活性:npm支持丰富的配置选项,允许用户高度自定义安装过程,包括版本锁定、脚本自定义等。
  • 命令行工具:npm提供了强大的CLI工具,不仅用于包的安装、更新和卸载,还支持脚本执行、版本管理等功能。

缺点

  • 安装速度:早期版本的npm因依赖解析算法效率问题,导致安装速度较慢,尤其是在处理大量依赖时。
  • 一致性问题:npm允许在不同环境中安装相同的依赖但版本可能不一致,这可能导致“依赖地狱”问题。
  • 缓存管理:npm的缓存机制有时会导致占用大量磁盘空间,且清理不够智能。

2、yarn

2.1 概述

Yarn 是一个 JavaScript 的包管理器,它是由 Facebook、Google、Tilde 以及其他社区成员共同维护的开源项目。Yarn 在 NPM 的基础上进行了改进和增强,旨在提高依赖包的安装速度和可靠性。

2.2 安装

如果您已经安装了 Node.js,可以通过 npm 来安装 Yarn。通过 npm 安装 Yarn 有两种方式:

1、全局安装

# 全局安装
npm install -g yarn

# 查看 Yarn 版本信息
yarn -v

这种方式会将 Yarn 安装到全局环境中,从而可以在任意位置使用 yarn 命令。

2、本地安装

# 本地安装
npm install yarn

# 查看 Yarn 版本信息
yarn -v

这种方式会将 Yarn 安装到当前目录的 node_modules 文件夹中。可以通过 ./node_modules/yarn/bin/yarn 命令来运行 Yarn。

注意:可以使用以下命令来安装特定版本的 Yarn

# 查看可用的 Yarn 版本
npm view yarn versions

# 全局安装特定版本
npm install -g yarn@<version>

# 本地安装特定版本
npm install yarn@<version>

# 查看 Yarn 版本信息
yarn -v

2.3 常用命令

# 1、该命令将引导您创建一个新的 package.json 文件。您可以提供一些信息,例如项目名称、版本号、作者、描述等。
yarn init

# 2、该命令将安装指定的软件包并将其添加到项目依赖项中。您可以使用 @ 版本前缀来安装特定版本的软件包。例如:yarn add package@1.0.0。
yarn add [package]

# 3、该命令将从项目依赖项中删除指定的软件包。
yarn remove [package]

# 4、该命令将更新指定软件包的版本。您可以使用 @ 版本前缀来更新特定版本的软件包。例如:yarn upgrade package@1.0.0。
yarn upgrade [package]

# 5、该命令将根据项目中的 package.json 文件安装所有依赖项。如果您在运行时指定了 --production 标志,则只会安装生产依赖项。
yarn install

# 6、该命令将清除 Yarn 的缓存。这可能会释放一些磁盘空间并解决某些依赖项问题。
yarn cache clean

# 7、该命令将全局安装指定的软件包。这通常用于安装全局命令行工具。
yarn global add [package]

# 8、该命令将从全局安装中删除指定的软件包。
yarn global remove [package]

# 9、该命令将列出当前项目中的所有依赖项。
yarn list

# 10、该命令将运行项目中指定的脚本。例如:yarn run start。
yarn run [script]

# 11、该命令将运行项目中的测试脚本。
yarn test

# 12、该命令将根据项目中的配置文件构建项目。
yarn build

# 13、该命令将发布您的软件包到 Yarn 存储库中。
yarn publish

# 14、该命令将显示有关指定软件包的详细信息。
yarn info [package]

# 15、该命令将使您登录到 Yarn 存储库。
yarn login

# 16、该命令将使您从 Yarn 存储库注销。
yarn logout

# 17、该命令将允许您将本地软件包链接到项目中。
yarn link [package]

# 18、该命令将从项目中取消链接指定的软件包。
yarn unlink [package]

# 19、该命令将显示指定软件包的依赖项信息。
yarn why [package]

# 20、该命令将显示项目依赖项的许可证信息。
yarn licenses ls

2.4 优缺点

优点

  • 更快的安装速度:Yarn通过并行下载、缓存机制和更高效的依赖解析算法,显著提高了安装速度。
  • 确定性构建:Yarn确保每次安装的结果都是一致的,无论是在哪个系统或何时安装,解决了npm的“依赖地狱”问题。
  • 更好的安全措施:Yarn提供了安全检查功能,可以检查已知漏洞的依赖,增强项目的安全性。
  • 工作空间管理:Yarn支持多包工作空间管理,方便大型项目或 mono-repo 的维护。

缺点

  • 生态兼容性:尽管Yarn与npm兼容,但某些npm特定的功能或插件可能在Yarn中无法完美运行。
  • 学习曲线:对于习惯使用npm的开发者来说,Yarn的配置和一些高级功能可能需要时间学习。

3、pnpm

3.1 概述

pnpm,即performant npm,高性能的npm。相比起目前主流的包管理器,pnpm是速度快、节省磁盘空间的包管理器。

3.2 安装

1、使用 npm 全局安装

# 使用 npm 全局安装
npm install -g pnpm

# 查看 pnpm 版本信息
pnpm --version

2、使用 yarn 全局安装

# 使用 yarn 全局安装
yarn global add pnpm

# 查看 pnpm 版本信息
pnpm --version

注意:可以使用以下命令来安装特定版本的 pnpm

# 查看可用的 pnpm 版本
npm view pnpm versions

# 使用 npm 全局安装特定版本
npm install -g pnpm@<version>

# 使用 npm 本地安装特定版本
npm install pnpm@<version>

# 查看 pnpm 版本信息
pnpm --version

3.3 常用命令

# 1、用于安装项目中的所有依赖。
pnpm install

# 2、用于安装指定的依赖包,例如 pnpm install react。
pnpm install [package]

# 3、用于全局安装指定的依赖包,例如 pnpm install --global typescript。
pnpm install --global [package]

# 4、用于更新项目中的所有依赖。
pnpm update

# 5、用于更新指定的依赖包,例如 pnpm update react。
pnpm update [package]

# 6、用于删除指定的依赖包,例如 pnpm remove react。
pnpm remove [package]

# 7、用于列出当前项目中已安装的所有依赖包。
pnpm list

# 8、用于列出当前系统中已全局安装的所有依赖包。
pnpm list --global

# 9、用于列出当前项目中已安装的所有依赖包及其直接依赖项。
pnpm list --depth=1

# 10、用于查看指定依赖包的详细信息,例如 pnpm info react。
pnpm info [package]

# 11、用于将指定的依赖包添加到 devDependencies,例如 pnpm add jest --save-dev。
pnpm add [package] --save-dev

# 12、用于将指定的依赖包添加到 dependencies,例如 pnpm add react --save。
pnpm add [package] --save

# 13、用于全局安装指定的依赖包,例如 pnpm add typescript --global。
pnpm add [package] --global

# 14、用于重新构建项目中的所有依赖。
pnpm rebuild

# 15、用于运行项目中的脚本命令,例如 pnpm run start。
pnpm run [script]

# 16、用于查看本地包存储状态。
pnpm store status

# 17、用于清理本地存储的未被任何项目使用的包。
pnpm store prune

# 18、用于将指定的依赖包添加到本地存储,以便其他项目使用。
pnpm store add [package]

# 19、用于启动本地包服务器。
pnpm server

# 20、用于在所有项目中执行指定命令,例如 pnpm recursive install。
pnpm recursive [command]

3.4 优缺点

优点

  • 高效存储和速度:pnpm通过“硬链接”和“文件复用”技术,极大地减少了磁盘占用和安装时间,即使在大型项目中也表现出色。
  • 完全兼容npm和Yarn:pnpm设计为与npm和Yarn的配置文件兼容,无缝迁移成本低。
  • 严格模式:pnpm默认启用“严格模式”,强制执行精确的版本控制,有助于避免潜在的依赖冲突。
  • 跨平台性能:pnpm在Windows、Linux和macOS上表现一致,解决了npm在某些平台上性能不佳的问题。

缺点

  • 相对较小的社区:相比npm和Yarn,pnpm的用户群较小,意味着遇到问题时可获取的帮助资源可能较少。
  • 生态系统集成:虽然兼容npm生态,但某些IDE或CI/CD工具可能对pnpm的支持不如npm和Yarn成熟。

2.5

4、总结

工具npmyarnpnpm
工作原理递归地安装所有依赖到node_modules目录下构建扁平化的依赖树并优化安装过程使用单个全局存储层和符号链接来减少磁盘空间占用
安装方式npm installyarn add/installpnpm install
缓存机制本地缓存每个项目的依赖共享缓存,保证多个项目间的依赖版本一致共享存储层缓存,避免重复下载
安装速度相对较慢,尤其在网络不佳时快于npm,支持并行安装更快,充分利用磁盘空间和网络资源
磁盘空间占用每个项目下的node_modules有完整副本,占用较多空间同一依赖只在全局缓存一份利用符号链接进一步减少磁盘占用
锁定文件package-lock.jsonyarn.lockpnpm-lock.yaml
依赖一致性通过package-lock.json实现一定的依赖版本控制强制一致,每次安装都会严格按照yarn.lock文件同样强制一致,基于pnpm-lock.yaml
离线模式支持,但需先下载过相关包提供强大的离线模式也支持离线安装
网络策略单线程请求多线程并行请求多线程并行请求,智能网络调度
安全性通过npm audit检查依赖的安全性同样具有审计功能,检查安全漏洞支持安全审计
交互界面提供基本的命令行交互更友好的CLI,提供进度条等反馈CLI体验良好,同样提供进度显示
生态系统最大,兼容性最好兼容npm的所有特性,并额外增强了一些功能对npm生态完全兼容,但在大型项目中有更好表现
特色功能npx,用于执行一次性命令;npm ci用于快速、可靠的持续集成环境构建更加严格的版本控制,改进的冲突解决策略;workspaces支持多包管理针对monorepo设计,高效的多包管理和tree shaking能力

以上表格涵盖了这些包管理器的主要特性对比,实际使用中还可能涉及其他细节上的差异。

  • 性能:🌟 Yarn和pnpm在安装速度方面优于npm,尤其对于大型项目和频繁安装的情况。💥 pnpm在磁盘空间占用上表现最佳。
  • 一致性:🔒 三者都支持依赖版本锁定,但Yarn和pnpm在这方面更为严格,能有效防止因依赖版本不一致引发的问题。
  • 生态:🌳 npm拥有最大的生态系统,但由于Yarn和pnpm的高度兼容性,大多数npm包都可以无缝迁移到这两个工具上。

在实际项目中,开发者可以根据项目的具体需求和团队偏好选择合适的包管理器。对于小型项目或者初次接触Node.js生态的新手,npm 可能是入门的最佳选择;而对于需要高效管理大型项目和依赖的大团队,Yarn 或 pnpm 则可能带来更高的效率和更好的资源管理效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端~初学者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值