nodejs包管理工具:pnpm
本文最后更新于 2025年4月22日 下午
根据公开信息,pnpm是最新出现的nodejs主流包管理工具。从简要的介绍中可以看到,它最大的底层改动是使用了软/硬链接功能,从而做到需要被依赖的包的某个版本在机器上只被安装一次,就能被不同项目所使用。
安装
如果nodejs版本大于16.13,可以直接使用corepack
使用enable命令将三个主要包管理器都安装了,pnpm
就是其中之一。官网也介绍了很多其他安装办法,具体可以查看pnpm的安装去查看。
基础命令
管理依赖的命令
名称 | 说明 |
---|---|
add | 将存储库中的包添加到项目中,默认会作为生产依赖 |
i,install | 安装package.json文件中声明的所有依赖,并且递归安装这些依赖的依赖 |
up,update | 在指定的范围内更新依赖包,这个指定的范围应该是pnpm-lock.yaml 中每个依赖的specifier的值 |
检查依赖的命令
名称 | 说明 |
---|---|
audit | 检查已安装包的已知安全问题 |
ls,list | 以一个树结构显示已安装包及其依赖 |
outdated | 检查过时的软件包 |
管理存储库的命令
存储库(store)是pnpm设计机制的一个概念,pnpm将所有的依赖包安装在硬盘的某个位置(store库),然后在项目中的node_moudules文件夹中建立一个*.pnpm* 的文件夹,并在这个文件夹中列出项目所需要依赖的所有package及其版本号,这些带着版本号的package文件都是硬链接到store库中的文件。然后在node_moudules文件夹的根目录下再通过符号链接链接到 .pnpm 文件夹下的文件里面。(但是我并不十分确定这个理解是不是正确)。
名称 | 说明 |
---|---|
store add | 直接把新包存储到store文件夹下,但是不改变项目文件或者store库外的文件 |
store path | 指定store文件夹的路径,为了让项目能用上这些链接,在windows中,必须和项目在同一个盘符下(比如C盘,D盘) |
store prune | 从store删除未引用的包 |
store status | 检查store库中已经改变了的包(应该通常是版本号升级导致的改变) |
一些要注意的坑
1. 关于store的位置
在windows下,因为硬链接只能在同一个盘符下生效,所以一定要指定store路径与项目路径在一个盘符下,假设都在D盘,然后,使用如下命令:
1 |
|
其实没有必要,后面我发现pnpm
会在项目所在盘的根目录下自动生成一个.pnpm-store的文件夹,然后在这里存储依赖包的各个文件。
2. 关于一些依赖包无法加载一些脚本的问题
我使用hexo
的时候,在使用 pnpm install 命令之后,本博客目前用的hexo-theme-fluid
会提示报错,核心错误在于无法加载脚本。但是我试了很多方法都没有解决,但有时候这个问题会莫名其妙的消失,就很无语。我试过的办法包括:
提升node_modules的配置
https://www.pnpm.cn/blog/2020/10/17/node-modules-configuration-options-with-pnpm
具体命令是:
1 |
|
此方法无效
一些似懂非懂的发现
1. pnpm的全局包安装在哪里?
当使用npm的时候,全局安装的文件会在当前版本nodejs的根目录下,如下图所示:

但是pnpm
安装的文件,不是在这里,而是要在一个全局二进制文件夹(global bin directory
)下,这个文件可以通过输入命令pnpm setup
来自动创建,这个命令会干3件事情:
- 创建当前用户的全局二进制文件夹,在windows系统中,一般是在
C:\Users\{curretnUserName}\AppData\Local\pnpm
。 - 将1中的路径设置为用户的环境变量,即
PNPM_HOME=C:\Users\{curretnUserName}\AppData\Local\pnpm
。 - 将环境变量添加到用户的
Path
环境变量中。
NeverLetDownDreams NeverWasteLife