pnpm 使用 - yeastgrow/blog GitHub Wiki

pnpm vs npm

pnpmnpm 都是 Node.js 的包管理工具,但它们在设计理念、性能和使用方式上有一些显著的不同。以下是它们的主要区别:

1. 安装机制

  • npm: 使用的是嵌套的 node_modules 结构。每个项目都有自己的 node_modules 目录,依赖包会被重复安装在不同的项目中,导致磁盘空间的浪费。
  • pnpm: 使用的是平铺的 node_modules 结构。所有项目的依赖包都存储在一个全局存储(global store)中,项目中的 node_modules 只是指向全局存储中的符号链接(symlink)。这样可以节省磁盘空间,并且安装速度更快。

2. 性能

  • npm: 由于依赖包的重复安装,npm 的安装速度相对较慢,尤其是在多个项目中使用相同的依赖包时。
  • pnpm: 由于使用了全局存储和符号链接,pnpm 的安装速度通常比 npm 快,尤其是在多个项目中使用相同的依赖包时。

3. 磁盘空间

  • npm: 由于依赖包的重复安装,npm 会占用更多的磁盘空间。
  • pnpm: 由于依赖包的共享,pnpm 占用的磁盘空间更少。

4. 依赖解析

  • npm: 使用的是嵌套的 node_modules 结构,可能会导致依赖冲突和版本不一致的问题。
  • pnpm: 使用的是平铺的 node_modules 结构,依赖解析更加清晰和一致,减少了依赖冲突的可能性。

5. 安全性

  • npm: 由于依赖包的重复安装,npm 可能会导致安全漏洞的重复出现。
  • pnpm: 由于依赖包的共享,pnpm 可以更容易地管理和更新依赖包,从而提高安全性。

6. 兼容性

  • npm: 由于是 Node.js 的默认包管理工具,npm 具有广泛的兼容性和支持。
  • pnpm: 虽然 pnpm 在设计上更加高效,但可能需要一些时间来适应其工作方式,尤其是在处理一些复杂的依赖关系时。

pnpm installation

安装 pnpm 非常简单,可以通过以下几种方式进行安装:

1. 使用 npm 安装

你可以使用 npm 来安装 pnpm。虽然 pnpm 旨在替代 npm,但你可以先使用 npm 来安装 pnpm

npm install -g pnpm

2. 使用安装脚本

pnpm 提供了一个安装脚本,可以直接从命令行运行:

curl -fsSL https://get.pnpm.io/install.sh | sh -

或者在 Windows 上使用 PowerShell:

iwr https://get.pnpm.io/install.ps1 -useb | iex

3. 使用 Homebrew(macOS/Linux)

如果你使用的是 macOS 或 Linux,并且已经安装了 Homebrew,你可以使用 Homebrew 来安装 pnpm

brew install pnpm

4. 验证安装

安装完成后,你可以通过以下命令来验证 pnpm 是否安装成功:

pnpm --version

如果安装成功,你应该会看到 pnpm 的版本号。

pnpm migration

将一个原本使用 npm 的项目迁移到 pnpm 是一个相对简单的过程。以下是详细的步骤:

1. 安装 pnpm

首先,确保你已经安装了 pnpm。如果你还没有安装,可以参考前面的安装步骤。

2. 删除现有的 node_modules 目录

在迁移之前,你需要删除现有的 node_modules 目录,以便 pnpm 可以重新安装依赖。

rm -rf node_modules

在 Windows 上,你可以使用以下命令:

rmdir /s /q node_modules

3. 安装项目依赖

使用 pnpm 安装项目的依赖。你可以使用 pnpm install 命令来安装 package.json 中列出的所有依赖。

pnpm install

4. 更新脚本命令

如果你在 package.json 中定义了一些脚本命令(例如 startbuild 等),你可能需要更新这些命令以使用 pnpm。例如,如果你之前使用的是 npm start,现在应该使用 pnpm start

{
  "scripts": {
    "start": "pnpm start",
    "build": "pnpm build"
  }
}

5. 更新 CI/CD 配置

如果你在持续集成/持续部署(CI/CD)管道中使用 npm,你需要更新配置文件以使用 pnpm。例如,如果你使用的是 GitHub Actions,你可能需要更新 .github/workflows/ci.yml 文件。

- name: Install dependencies
  run: pnpm install

- name: Build project
  run: pnpm build

pnpm basic usage

pnpm 将其依赖包存储在一个全局存储(global store)中,而不是像 npm 那样在每个项目的 node_modules 目录中重复安装。这个全局存储的位置取决于你的操作系统和配置。

默认存储位置

1. Linux 和 macOS

在 Linux 和 macOS 上,pnpm 的默认全局存储位置通常是:

~/.pnpm-store/v3

2. Windows

在 Windows 上,pnpm 的默认全局存储位置通常是:

C:\Users\<YourUsername>\.pnpm-store\v3

自定义存储位置

你可以通过设置环境变量 PNPM_STORE_DIR 来指定自定义的存储位置。例如,如果你想将存储位置设置为 /custom/path/pnpm-store,你可以在命令行中设置环境变量:

export PNPM_STORE_DIR=/custom/path/pnpm-store

或者在 Windows 上使用 PowerShell:

$env:PNPM_STORE_DIR = "C:\custom\path\pnpm-store"

查看当前存储位置

你可以使用 pnpm store path 命令来查看当前的存储位置:

pnpm store path

清理存储

如果你想要清理未使用的依赖包,可以使用 pnpm store prune 命令:

pnpm store prune

这个命令会删除存储中未被任何项目引用的依赖包,从而释放磁盘空间。

总结

pnpm 将其依赖包存储在一个全局存储中,默认位置取决于操作系统和用户配置。你可以通过设置环境变量 PNPM_STORE_DIR 来自定义存储位置,并使用 pnpm store path 命令查看当前的存储位置。